2

Python のインポート機能は、今でもときどき混乱します。次に例を示します。

私のプロジェクトのパッケージ構造は次のとおりです。

Project/
    src/
        example/
            __init__.py
            an_example.py
        top/
            __init__.py
            lin/
                __init__.py
                factory.py

an_example.py、書きたいのですが

from top import lin
if __name__ == '__main__':
    a = lin.factory.AClass()

ただし、これは次の場合に失敗します。

    a = lin.factory.AClass()
AttributeError: 'module' object has no attribute 'factory'

an_example.py次のように書くと動作します:

from top.lin import factory
if __name__ == '__main__':
    a = factory.AClass()

最初のバージョンのように import ステートメントを書くのがなぜ間違っているのか説明してもらえますか? のような完全修飾名を希望lin.factory.AClassfactory.AClassます。

4

1 に答える 1

4

これは、 にインポートするように指示しない限り、lin名前factory空間にないためです。__init__.pyfactorylin

例えば:

an_example.py に以下が含まれている既存のプロジェクト構造を想定します。

from top import lin

lin.factory.AClass()

top/lin/__init__.py空白の場合、 が得られますImportError: No module named factory

top/lin/__init__.py含むimport top.lin.factoryと、エラーは発生しません。

を使用するように依頼するとfactory.AClass()、そこで定義されているため機能します。lin同様に、そこから使用したい場合は factory in を定義する必要があります。

于 2012-04-26T13:22:42.853 に答える