0

3 つのファイルがあるとしましょう。それらを a、b、c と呼びます。これらのスクリプトを実行および構築するために崇高なツールを使用しています。

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 についても同様です。要するに、すべてが機能します。ただし、「from ... import ...」形式の 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 に答える