0

好吧,假设我有 3 个文件,我们称它们为 a、b、c。我正在使用 sublime 来运行和构建这些脚本。

a imports and uses method from b
b imports and uses method from c
c imports and uses method from a

使用 ctrl+b Sublime 2 将构建并运行我的代码。

使用激活选项卡构建==>

Error: module b has no attribute 'x'

使用b选项卡进行构建==>

Error: Module c has no attribute 'y'

使用c选项卡进行构建==>

Success

这是特定于 Sublime 的问题还是我的代码有问题。

4

1 回答 1

0

在进行循环导入时,Python 中有一个棘手的极端情况。如果你使用 import 语句的“import ...”形式,像这样:

# a.py
import b
def method_a():
    print "Method A called"
def call_b_from_a():
    b.method_b()

 

# b.py
import c
def method_b():
    print "Method B called"
def call_c_from_b():
    c.method_c()

 

# c.py
import a
def method_c():
    print "Method C called"
def call_a_from_c():
    a.method_a()

然后你可以做这样的事情:

>>> import a
>>> a.call_b_from_a()
Method B called

对于 b 和 c 也是如此;简而言之,一切正常。但是,如果您使用 import 语句的“from ... import ...”形式,如下所示:

# a.py
from b import method_b
def method_a():
    print "Method A called"
def call_b_from_a():
    method_b()

 

# b.py
from c import method_c
def method_b():
    print "Method B called"
def call_c_from_b():
    method_c()

 

# c.py
from a import method_a
def method_c():
    print "Method C called"
def call_a_from_c():
    method_a()

然后你会得到这样的错误:

>>> import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "a.py", line 2, in <module>
    from b import method_b
  File "b.py", line 2, in <module>
    from c import method_c
      File "c.py", line 2, in <module>
    from a import method_a
ImportError: cannot import name method_a

简而言之,可以使用循环导入,但它们确实会造成一些极端情况。在没有实际看到您的代码的情况下,我猜这可能与此有关。

为了将来参考,如果您发布您正在使用的实际代码,您几乎总能得到更好的答案。

于 2012-05-01T04:50:38.870 回答