11

Python プロジェクトのソースコードを読んでいて、次の行に出くわしました。

from couchexport.export import Format

(ソース: https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1 )

私は(Class?Dict?何か他のもの?)が何であるかcouchexport/export.pyを見に行きました。Format残念ながらFormatそのファイルにはありません。 export.pyただし、クラスがあるFormatcouchexport.modelsからaをインポートします(ソース: https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11 )。Format

IDE で元のファイルを開いて宣言を検索すると、この質問の冒頭で述べたように、models.py に直接つながります。

どうしたの?あるファイル ( ) からのインポートが、明示的に述べられていないexport.py別のファイル ( ) からのインポートである可能性はありますか?models.py

4

1 に答える 1

19

moduleaが を実行するfrom b import Foo場合Fooは、after のメンバーであり、aとしてアクセスできますa.Foo。を使用してインポートできるようになったのは、その結果だけですfrom a import Foo

これは、複数のファイルに分散された大規模なライブラリがあり、1 つの場所からそれらにアクセスできるようにする場合によく使用されます。foo次のレイアウトのパッケージがあるとします。

foo/
    a.py
    b.py
    c.py
    __init__.py

a.pyb.pyc.pyは、クラスA、 、BおよびCをそれぞれ定義します。

これらのクラスを使用したい場合は、通常、次のように記述する必要があります。

from foo.a import A
from foo.b import B
from foo.c import C

これには少なくとも 2 つの問題があります。

  1. この単純なインポートには、多くのコード (3 行) が必要です。
  2. ライブラリの作成者は、ファイル/クラスの関連付けを後で変更できなくなりました。これは、既存のコードが破損するためです。

したがって、通常は次を に入れるだけです__init__.py

from a import A
from b import B
from c import C

すべてのピースを 1 か所にまとめると、1 つのインポートですべてのクラスにアクセスできるようになります。

from foo import A,B,C
于 2012-04-07T11:04:54.660 に答える