首页 > 解决方案 > 调用需要在当前环境中定义的内容的导入函数时出现 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失败。

标签: pythonimportnameerrorscopinglexical-scope

解决方案


buzz函数的定义在模块“b.py”中。这意味着当执行主体时buzzbuzz()在 c.py 中),解释器跳转到模块b。模块b的全局命名空间是buzz函数体可以访问全局变量而不是c全局命名空间的地方,当然"Foobar"模块b中没有globals()

在 LEGB 规则中,“G”指向解释器当前所在模块的全局命名空间,而不是其他模块的全局命名空间。


推荐阅读