Python &引用__全球的;使用装饰器时是否合并?
在下面的代码中,Python &引用__全球的;使用装饰器时是否合并?,python,Python,在下面的代码中,func2似乎具有func1+的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>以及上下文库中的符号。有人能详细说明一下这种globals合并是如何工作的吗?也就是说,它是否合并了定义函数所涉及的所有模块的\u dict\u?还有,当名字冲突时会发生什么 import contextlib def func1(): pass @contextlib.contextmanager def
func2
似乎具有func1
+的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>以及上下文库中的符号。有人能详细说明一下这种globals
合并是如何工作的吗?也就是说,它是否合并了定义函数所涉及的所有模块的\u dict\u
?还有,当名字冲突时会发生什么
import contextlib
def func1():
pass
@contextlib.contextmanager
def func2(args):
pass
globals1 = set(func1.__globals__.keys())
globals2 = set(func2.__globals__.keys())
globals2.difference(globals1)
{'GeneratorContextManager',
'__all__',
'__file__',
'closing',
'contextmanager',
'nested',
'warn',
'wraps'}
使用Python 2.7.10每个函数对象将具有\uuuuu globals\uuuuuu
以引用定义函数的模块的全局名称空间
在您的示例中,func1
在您的模块中定义,并具有该模块的全局变量。您在模块中定义了func2
,但是contextmanager
装饰器用另一个函数包装您的函数。该包装函数是在contextlib
中定义的,因此当装饰程序用包装版本替换func2
时,结果函数的全局值为contextlib
。它没有模块的全局变量
但是,包装函数保留了对原始函数的引用,而原始函数仍然具有您自己模块的全局变量。在您的示例中,这可以通过func2.\uuu闭包\uuuu[0]看到。单元格内容
:
# func1 is not in func2's globals
>>> func2.__globals__['func1']
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
func2.__globals__['func1']
KeyError: u'func1'
# func1 is in the globals of the internally-stored wrapped version of func2
>>> func2.__closure__[0].cell_contents.__globals__['func1']
<function func1 at 0x0000000002B2B358>
#func1不在func2的全局中
>>>函数2._全局函数_['func1']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
函数2._全局函数_['func1']
键错误:u'func1'
#func1位于内部存储的func2包装版本的全局中
>>>func2.\uuuuu闭包\uuuuuu[0]。单元格内容。\uuuuuu全局值\uuuuu['func1']
是什么让你认为它两者都有?因为如果我取两组全局变量的集差,我会在第二个更新的问题中看到contextlib.py
中的符号,该问题只显示func1.\uuuu globals\uuuu
没有那些contextlib名称;它没有显示func2.\uuuuglobals\uuuuuu
确实有func1
(事实上它没有)。好的,好的,我假设东西来自globals,但它似乎是从闭包中得到的