导入的模块超出范围(未绑定的本地错误)

时间:2016-06-21 23:37:59

标签: python scope

我在python包中遇到一个奇怪的“未绑定的本地”错误,似乎无视所有逻辑。我不能让MWE重现它,但会尝试简洁地解释,并希望有人能够提供一些正在发生的事情的解释。

为了这个示例,module是我开发的包,Modelmodule中的一个类。 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,但我似乎无法在完整代码的上下文之外重现这一点。我希望有人能够了解可能会发生什么,并提出一些进一步调试的策略。

1 个答案:

答案 0 :(得分:3)

显然,在函数module中的某处有一个名为run的局部变量。例如,以下代码将抛出UnboundLocalError

import sys

def run():
     print sys
     sys = None
run()

此处sys = None引入了一个本地名称,该名称隐藏了sys内部导入的run,并且在调用时print尚未定义,因此出现错误。要在run中使用导入的模块,您必须查找并重命名本地变量。 有关python范围规则的更多信息是here