我在python包中遇到一个奇怪的“未绑定的本地”错误,似乎无视所有逻辑。我不能让MWE重现它,但会尝试简洁地解释,并希望有人能够提供一些正在发生的事情的解释。
为了这个示例,module
是我开发的包,Model
是module
中的一个类。 Model
类(model.py)的定义如下:
import module
class Model:
def __init__(self):
print module
def run(self):
print module
现在,当我在这样的脚本中实例化Model
时:
from model import Model
m = Model()
m.run()
module
在__init__
内成功打印,但我在run
函数中收到了未绑定的本地错误。
我试图用pdb来诊断它,这是事情变得非常奇怪的地方,因为如果我在print module
函数的run()
行之前添加一个pdb跟踪,那么我就可以成功运行print module
没有未绑定的本地错误,但如果我跳到下一行,则会抛出错误。 module
如何在__init__()
的范围内,在pdb的范围内,但不在run()
的范围内?
我知道这不是理想的,因为没有MWE,但我似乎无法在完整代码的上下文之外重现这一点。我希望有人能够了解可能会发生什么,并提出一些进一步调试的策略。
答案 0 :(得分:3)
显然,在函数module
中的某处有一个名为run
的局部变量。例如,以下代码将抛出UnboundLocalError
import sys
def run():
print sys
sys = None
run()
此处sys = None
引入了一个本地名称,该名称隐藏了sys
内部导入的run
,并且在调用时print
尚未定义,因此出现错误。要在run
中使用导入的模块,您必须查找并重命名本地变量。
有关python范围规则的更多信息是here