哪里是nonlocals()?

我如何获得当前范围内的非本地变量? 功能varslocalsglobals的存在,但有一个函数来获取nonlocals

为什么不打电话时列 ​​出的nonlocals vars

更新

我的问题是,有没有办法来枚举当前范围中可用的变量,既不varsglobals包括非本地人AFAICT。

我经常使用vars代码如下所示:

'{meh[0]}/{meh[3]} {a}{b}{c}'.format(**vars())

这意味着,如果这些变量都包含函数的范围将失败。

--------------解决方案-------------

从运行的代码中,你可以轻松地获得非局部变量的名称-但他们retriving的方式来调用内容locals让你一本字典是一个有点棘手。

所使用的nonlocal变量名存储在当前正在运行的代码对象,在co_freevars属性。

因此,获得了非本地名称是的问题:

names = inspect.currentframe().f_code.co_freevars

这些变量的内容 ,但是,被存储在__closure__属性( func_closure ,在Python 2)中, 函数对象来代替。 (不代码对象)。 问题是,没有“外界援助”,有一个运行的代码去运行它函数对象没有简单的方法。 你可以在框架对象,它链接到代码的对象,但没有链接回函数对象。 (对于顶层定义功能的一个可以显式使用函数已知名称,如在用于def statement`但对于一个封闭的函数,即返回到调用者,不存在任知道其名称的方式)。

因此,人们不得不求助于一招-通过使用GC模块(垃圾收集器)获得链接到当前代码对象的所有对象-有一个gc.get_referrers通话-将返回链接到所有的函数对象代码对象之一成立。

所以,用non_local变量的函数内的一个可以这样做:

import inspect, gc

def a(b):
b1 = 2
def c():
nonlocal b1
print (b)
code = inspect.currentframe().f_code
names = code.co_freevars
function = [func for func in gc.get_referrers(code) if isinstance(func, FunctionType)][0]
nonlocals = dict (zip(names, (x.cell_contents for x in function.__closure__ )))
print(nonlocals)
return inspect.currentframe()
return c

c = a(5)
f = c()

因此检索nonlocals的名称和值。 但是,如果你身边有(也就是说,如果感兴趣的功能创建不止一次与多个调用载体作用该函数的多个实例,这将不起作用产生它) - becasue所有这些实例将链接到相同的代码对象。 上面的例子中,假设只有一个与当前代码运行功能 - 并会在这种情况下,正常工作。 到factrory函数调用另一个将创造另一个函数,与非局部变量可能还有其他的值,但相同的代码的对象-在function =列表都能运行上面将检索所有这些,和任意挑头的那些。

“正确”的功能是在其当前的代码执行一个 - 我试图想检索信息的一种方式,但不能得到它。 如果可以,我会完成这个答案,但就目前而言,这不能帮助你找回nonlocals值的值。

(刚发现试图用“的eval”用非本地变量的名称将无法正常工作以及)

它看起来像连接当前正在运行的框架,其中非局部变量值保持在运行时创建Python解释器的本机端内的函数对象的唯一的事。 我想不出得到它短期使用ctypes的模块来看待口译的数据结构在运行时,这当然是不适合任何实际的生产代码的一种方式。

底线:你可以可靠地取回非本地变量名。 但它看起来就像你不能让他们的价值给予他们的名字作为字符串(也没有重新绑定的话)。

你可以尝试打开一个功能请求Python的bug跟踪或Python的理念邮件列表“nonlocals”的号召。

分类:蟒蛇 时间:2012-01-01 人气:0
分享到:

相关文章

  • 如何阅读从蟒蛇的(窗口)剪贴板中的文本? 2012-02-02

    如何阅读从蟒蛇的(窗口)剪贴板中的文本? --------------解决方案------------- 您可以使用名为win32clipboard的模块,这是pywin32的一部分. 这是第一次设置剪贴板数据,然后得到它的一个例子: import win32clipboard # set clipboard data win32clipboard.OpenClipboard() win32clipboard.SetClipboardText('testing 123') win32clipbo

  • 蟒蛇:如何实现在一个类中引用的所有创建的项目和一个简单的方法来删除这些项静态列表? 2012-06-18

    我有一个存储在静态列表这样创建的所有引用的类: class A: _List = [] def __init__(self): A._List.append(self) def __del__(self): A._List.remove(self) 现在,如果我做到以下几点: a = A() del a a没有被删除,因为它是在列表中仍参考. 但是,引用将被破坏,如果析构函数被调用. 有没有办法以某种方式强制蟒蛇执行__del__反正方法,以便它可以从静态列表中删除得到? -----------

  • 蟒蛇:有没有从包中导入*除了名称空间冲突劣势 2012-12-15

    我创建一个类来扩展包,和之前的类实例化,我不知道我需要哪些程序包的名称空间的子集. 我一直小心避免名字空间的冲突在我的代码,所以,不 from package import * 除了创建名称冲突的问题? 它是更好地检查类的输入和进口只有我需要的名字(在运行时__init__ 可以从一组[]蟒蛇进口? 不 for name in [namespace,namespace]: from package import name 有什么意义? 我希望这个问题似乎并不像不必要的手铃声,我只是超级新的Pyt

  • 如何让更多的表现蟒蛇迭代器? 就像C ++中的迭代器 2013-10-28

    首先,我回顾了C ++风格的迭代quickly.for例如: //--- Iterating over vector with iterator. vector<int> v; . . . for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) { cout << *it << endl; } 它是柔性的. 这是很容易改变基础容器类型. 例如,您可能会在以后决定插入和缺失的数量是如此之高,列

  • 如何找回从蟒蛇的有效对象在C ++中,而这个对象使用手柄被构造? 2013-11-10

    我想在C ++中分配一个缓冲区,并提供给Python作为一个memoryview对象. 要做到这一点,我使用boost :: python的公开此功能: object* Allocator() { void* buff = my_alloc_function(char, size); Py_buffer pybuffer; int res = PyBuffer_FillInfo(&pybuffer, 0, buff, size, false, PyBUF_CONTIG); if (res ==

  • 蟒蛇:如何输入在Python中的文件名 2014-07-22

    即时通讯很新的蟒蛇. 当我做fileofname = "a2.txt"那么我可以没有任何问题,但是我的代码运行,当我做fileofname = raw_input("enter the file name:")然后我输入"a2.txt",它提出了一个"UnboundLocalError: local variable 'line' referenced before assignment" 有人能帮助我吗? ---------

  • 蟒蛇:如何使用Visual Studio中的调试信息的文件? 2012-01-11

    我使用的是优秀的Python的工具为Visual Studio在Visual Studio 2010中编写Python代码. 我可以设置一个断点,并通过我的Python代码步骤. 但是,我不能踏入的Python任何标准库代码(步入print()为例). 我注意到,Python.org还提供Visual Studio的调试信息的文件为每个Python版本. 这是一个包含ZIP文件.pdb文件Python的发布. 我需要做什么在Visual Studio 2010中配置才能够使用这些.pdb文件步入

  • 蟒蛇easy_install.pth为sys.path中 2012-03-13

    我看了看我的easy_install.pth文件/usr/local/lib/python2.6/dist-packages ,我认为这是默认的目录时,我通过easy_install的下载包. 里面easy_install.pth,入口之一是目录本身,即/usr/local/lib/python2.6/dist-packages . 然而,当我检查sys.path中, /usr/local/lib/python2.6/dist-packages不包括在路径本身. 我只是说,因为我下载了一个包,我

  • 蟒蛇xlrd,在工作簿中从上表看 2012-03-21

    我写这应该从2 XLS文件比较值的代码. 其中的一个文件有更多然后1张,我总是只能从最后一页读取数据. 我真的不知道该如何与这个管理. 有马代码: #! /usr/bin/python import xlrd #Import the package to read from excel #start with station report station_rep = xlrd.open_workbook("/home/fun/data/Station.xls",encoding_ove

  • 从列表中蟒蛇提取阵列 2012-04-28

    如果我有一个这样的名单: >>> data = [(1,2),(40,2),(9,80)] 我怎么可以提取两个列表[1,40,9]和[2,2,80]? 当然,我可以遍历并提取了自己的数字,但我想有更好的办法吗? --------------解决方案------------- 名单解析保存一天: first = [x for (x,y) in data] second = [y for (x,y) in data] 解压缩操作: In [1]: data = [(1,2),(40,2),(

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.505 (s). 10 q(s)