1

言葉

構造は次のとおりです。モジュールtestには 2 つのサブモジュールtest.fooとが含まれますtest.bar

test.fooPythonのドキュメントに基づいinc()て使用する関数があり、それを含める適切な方法であり、これは期待どおりに機能します。test.bar.bar()from . import bar

test.barただし、 にもinc2を使用する機能がありますtest.foo.fooが、を使用するfrom . import fooと、これらのモジュールは両方とも壊れます。

これを達成するための正しい方法は何ですか? Pythonのドキュメントや検索ではほとんど見つかりませんでした。

コード

test / _init_.py

#empty

テスト/foo.py

from . import bar

def foo():
    print("I do foo")

def inc():
    print(bar.bar())

test/bar.py

from . import foo

def bar():
    print("I do bar")

def inc2():
    print(foo.foo())

エラー 1

>>> import test.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/foo.py", line 1, in <module>
    from . import bar
  File "test/bar.py", line 1, in <module>
    from . import foo
ImportError: cannot import name foo

エラー 2

>>> import test.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/bar.py", line 1, in <module>
    from . import foo
  File "test/foo.py", line 1, in <module>
    from . import bar
ImportError: cannot import name bar
4

1 に答える 1

4

解決策は、両方のモジュールに必要なコードを、両方によってインポートされる3番目のモジュールに除外することです。たとえば、foo関数を3番目のモジュールに配置します。

これについては、以前にStackOverflowに関する多くの質問があります。たとえば、Pythonでの循環インポートの依存関係などです。http://effbot.org/zone/import-confusion.htm#circular-importsも参照してください。

于 2012-07-22T07:32:55.673 に答える