1

次のような相対インポートに気付きました。

from .foo import myfunc
print myfunc  # ok
print foo  # ok

foo と myfunc の両方をインポートします。そのような動作はどこかに文書化されていますか? 無効にできますか?

- アップデート

基本的に問題は次のとおりです。

bar/foo/__init__.py:

__all__ = ['myfunc']

def myfunc(): pass

bar/__init__.py:

from .foo import *
# here I expect that there is only myfunc defined

main.py:

import foo
from bar import *  # this import shadows original foo

に追加__all__することもできbar/__init__.pyますが、その場合、いくつかの場所で名前を繰り返さなければなりません。

4

1 に答える 1

2

私はあなたのパッケージレイアウトが

my_package/
    __init__.py
        from .foo import myfunc
    foo.py
        def myfunc(): pass

ステートメントfrom .foo import myfuncは最初にモジュールをインポートしますfooが、通常はローカルスコープに名前を導入しません。この最初のステップの後、myfuncはローカル名前空間にインポートされます。

ただし、この特定のケースでは、最初のステップでモジュールもローカル名前空間にインポートされます。パッケージのサブモジュールは、インポート場所に関係なく、インポート時にパッケージの名前空間に配置されます。パッケージの名前空間でも実行されるため__init__.py、これはローカルの名前空間と一致します。

この動作を合理的に無効にすることはできません。fooパッケージの名前空間に名前を付けたくない場合は、モジュールの名前を変更_fooして内部としてマークすることをお勧めします。

于 2012-07-20T14:57:15.197 に答える