我有一个函数和一个字典,其中包含对该函数的引用。
def func1(): print('blah')
dict1 = {'func1': func1}
如果我按照给定的顺序将它们粘贴到python解释器中,则一切正常。
`>>> def func1(): print('blah')
...
>>> func1
<function func1 at 0x7f8939d77730>
>>> func1()
blah
>>> dict1 = {'func1': func1}
>>> dict1['func1']()
blah
`
但是,如果我dict1
从文件导入,则解释器会说func1
未定义(即使已定义)。
因此,文件“ dictfile.py”仅包含一行文本:
dict1 = {'func1': func1}
然后将其输入解释器:
>>> def func1(): print('blah')
...
>>> func1()
blah
>>> from dictfile import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/../dictfile.py", line 1, in <module>
dict1 = {'func1': func1}
NameError: name 'func1' is not defined
>>>
这里发生了什么?
func1
未在您的dictfile.py
上下文范围内定义。
“ func1”的全局范围限于它定义自己。这样一来,它就可以作为独立模块运行。也就是说,它可以像应该运行的模块一样运行:因此可以由任何其他模块导入和运行它。这样做是为了避免不同模块在其全局定义中对不同事物使用相同名称时发生冲突。
从python docs:
因此,模块的作者可以在模块中使用全局变量,而不必担心与用户的全局变量的意外冲突。
通过使用import语句加载文件,可以使其成为模块。然后,您不能期望该模块获取您从中导入它的范围。它自己的范围仍然不同。它的完整性受到保护。如果它本身未定义,则它本身必须导入使用的所有定义。
为了能够加载引用该函数的字典,必须在函数所在的范围(文件)中定义该函数。
由于该dictfile.py
文件对您的解释器的当前状态一无所知(您的状态未导入到文件中,并且我不确定是否可能),因此找不到该函数的引用。
根据Python文档,
每个模块都有自己的专用符号表,模块中定义的所有功能都将其用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不必担心与用户的全局变量的意外冲突。另一方面,如果您知道自己在做什么,则可以使用与引用模块功能相同的符号modname.itemname来触摸模块的全局变量。
为了使您的功能在模块(文件)范围内可访问,您需要导入交互式解释器的“模块”,我认为这是不可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句