为什么不能在数据结构中导入函数名称

标记

我有一个函数和一个字典,其中包含对该函数的引用。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能在标准JavaScript中导入模块?

为什么不能在数组内部推送并在javascript的函数参数中使用它?

为什么不能在数据模板中使用{x:Bind {RelativeSource Self}}?

为什么我不能在TypeScript中导入sprintf-js

Scala:使函数在数据结构类型中多态

为什么在这种情况下不能将函数名称作为参数传递?

为什么事件模糊不能与函数名称模糊一起使用?

为什么我们不能在数组函数参数中省略数组破坏的括号?

为什么我的测试文件不会导入我的数据结构?哈斯克尔

为什么我不能在数字列上过滤Pandas数据框

数据结构的名称

pip install bert后为什么不能在bert中导入函数

为什么我不能在PyCharm中导入两个模块?

函数名称为什么不能与返回名称类型相同?

为什么这些函数不能在数组中找到最长和最短的单词?

Firebase实时数据库:为什么我不能在同一目录层次结构中导入多个JSON文件?

为什么我不能在头文件中单独写入名称空间的层次结构?

为什么我们不能在结构内部声明函数?

为什么不能在sys.path中导入模块?

yii2为什么我不能在数据库中存储数据?

为什么我不能在ES6中导出名为“导入”的函数

为什么我不能在Python中导入包?

为什么我不能在tensorflow中导入tfprof_log_pb2?

为什么我不能在@NgModule 中导入 Angular 2 服务?

为什么不能在默认对象中导出函数

为什么我不能在python中导入我自己的文件夹?

为什么我不能在同一个模块中导入包?

已经设置了 PYTHONPATH,但是为什么它不能在 Python 中导入我的自定义模块?

为什么我们不能在声明结构变量名称时使用连字符?