2

私は次のようなディレクトリ構造を持っています:

project/
        __init__.py
        foo/
            __init.py__
            first.py
            second.py
            third.py
        plum.py

で、project/foo/__init__.pyからクラスをインポートしfirst.pysecond.pythird.py入れます__all__

で使用したいfirst.pynamedのクラスがあり、からインポートしてインポートしたいと思います。(私がそうしたい理由はこの質問の範囲外です、私には正当な理由があると仮定してください。)WonderfulThingsecond.py*foo

second.py私が試したところfrom .foo import *、これらのケースのいずれもインポートさfrom foo import *れていません。また、「トップレベルパッケージを超えて相対インポートを試行しました」というエラーが発生するを試しました。from . import *WonderfulThingfrom ..foo import *

ドキュメントとPEPを読みましたが、これを機能させる方法がわかりません。どんな援助もいただければ幸いです。

明確化/編集:__all__パッケージでの動作を誤解していたようです。モジュールと同じように使っていましたが、

from .first import WonderfulThing
__all__ = [ "WonderfulThing" ]

__all__しかし、ドキュメントをもう一度見ると、デフォルトでインポートされるモジュールの名前を指定するためにパッケージでのみ使用できることが示唆されているようです。モジュール以外のものを含める方法はないようです。

これは正しいです?

ワイルドカード以外のインポートに失敗しました(cannot import name WonderfulThing)。試行from . import fooは失敗しましたが、import foo機能します。残念ながら、dir(foo)何も表示されません。

4

1 に答える 1

3

編集:私は質問を誤解しました:いいえ__all__はモジュールだけに限定されません。

1 つの質問は、なぜ相対インポートを行うのかということです。ここで を実行しても問題はありませんfrom project.foo import *。第二に、 foo の制限は、 、または単に__all__を実行することを妨げるものではありません。これは依然として最良の方法です。from project.foo.first import WonderfulThingfrom .first import WonderfulThing

本当に多くのものをインポートしたい場合は、 を実行してから、 を実行してから直接使用する代わりに をfrom project import foo使用するのがおそらく最善です。foo.WonderfulThingimport *WonderfulThing

ただし、直接の質問に答えるには、second.py のファイルからインポートするには、次の__init__ようにします。

from . import WonderfulThing

また

from . import *
于 2009-10-17T08:18:59.933 に答える