python - 调用需要在当前环境中定义的内容的导入函数时出现 NameError
问题描述
我有两个 Python 文件:
b.py
:
def buzz():
foobar = Foobar()
c.py
:
from b import buzz
class Foobar:
pass
buzz()
跑步python c.py
加注:
NameError: name 'Foobar' is not defined
看起来有一个基本的 Python 的导入机制我还是不明白。我希望,当buzz()
被调用时,它可以动态访问现在包含Foobar
.
当然(?),如果我用buzz
它的定义替换 import ,它可以工作:
d.py
:
def buzz():
foobar = Foobar()
class Foobar:
pass
buzz()
语境。
这可能是一个 XY 问题。最终,我希望能够buzz
根据Foobar
之前导入的变体来改变行为。但是,我有兴趣了解为什么b.py
/c.py
失败。
解决方案
buzz
函数的定义在模块“b.py”中。这意味着当执行主体时buzz
(buzz()
在 c.py 中),解释器跳转到模块b
。模块b
的全局命名空间是buzz
函数体可以访问全局变量而不是c
全局命名空间的地方,当然"Foobar"
模块b
中没有globals()
。
在 LEGB 规则中,“G”指向解释器当前所在模块的全局命名空间,而不是其他模块的全局命名空间。
推荐阅读
- python - 在同一 IP (Apache) 的不同 virtualenv 中为多个 Django 项目提供服务
- elasticsearch - Elasticsearch:没有映射的架构?
- android - 将数据从 ListView 传递到新活动
- laravel - Laravel 中的 SQLITE 访问被拒绝错误
- php - php在直接调用时没有返回有关角度http请求的数据
- github - Finding the number of views of a website
- php - 从 base64 图像字符串减少和预览图像
- html - 在Angular 4中发布数据时出现网络错误
- generics - Rust generics on arithmetic operation
- django - 删除模型妈妈实例