Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用__全球的;使用装饰器时是否合并?_Python - Fatal编程技术网

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,但它似乎是从闭包中得到的