【发布时间】:2015-01-06 02:51:17
【问题描述】:
假设我有以下代码。
foo.py
------
import bar
def abc(n):
return bar.xyz(n-1) if n>0 else "abc"
bar.py
------
import foo
def xyz(n):
return foo.abc(n-1) if n>0 else "xyz"
正如本文Circular (or cyclic) imports in Python 中所述,它会起作用。 (简单的解释是,假设我们从python repl调用import foo,当第一次遇到import bar时,python将bar放入sys.modules并执行bar.py,当遇到import foo时,因为@987654329 @已经在sys.modules中,即使foo模块不完整,import语句也会直接返回。)
现在,如果我将代码更改为以下内容:
foo.py
------
from bar import xyz
def abc(n):
return xyz(n-1) if n>0 else "abc"
bar.py
------
from foo import abc
def xyz(n):
return abc(n-1) if n>0 else "xyz"
导入将失败:
$ python foo.py
Traceback (most recent call last):
File "foo.py", line 1, in <module>
from bar import xyz
File "/Users/yxiong/bar.py", line 1, in <module>
from foo import abc
File "/Users/yxiong/foo.py", line 1, in <module>
from bar import xyz
ImportError: cannot import name xyz
这里值得注意的是python在from bar import xyz的第二次尝试中似乎失败了。
我的问题是,这些步骤到底发生了什么。具体来说,python 看到from foo import abc 语句会做什么?
【问题讨论】:
-
加一个有趣的问题。
标签: python python-import circular-dependency