Tag Archives: Python

Python的循环引用问题

假设有一个 module x 引用了 module y,然后定义一个方法 run:

# this is module x
import y
def run():
    print 'execute function in module x'

如果你的程序 import x,Python 会加载 module x 并执行里面的语句。当执行到 import y 时,就去转而加载并执行 module y。

到现在为止,Python 已经在 sys.modules 里注册了 x 和 y,但是 x 还没有执行 def run 即还没有定义 run 方法。

如果 y 引入了 x (循环引用问题),它会得到一个没有定义 run 方法的 x:

# this is module y
import x
x.run() # error

这时如果对 x 调用 run 方法则会报错提示找不到方法:

Traceback (most recent call last):
  File "test.py", line 1, in 
    import x
  File "/path/x.py", line 2, in 
    import y
  File "/path/y.py", line 3, in 
    x.run() # error
AttributeError: 'module' object has no attribute 'run'

解决这问题可以尝试两个方法:
1. 尽量避免在程序中出现循环引用。
2. 把 import 语句放到方法定义的后面。

在这个例子中,可以把 module x 中的 import y 语句移到最后面,让程序先执行方法定义,再 import y 即可解决。

-EOF-