2016-05-19 1 views
3

私はパッケージとモジュール名のシャドウイングのルールをPythonで理解しようとしています。 python:x import yから以前のインポート結果を変更します

├── mypackage 
│   ├── argparse.py 
│   └── __init__.py 
└── script.py 

mypackage

が、私は標準のシャドーイングモジュールを持っている私のカスタムトップレベルのパッケージです:この例は、私は次のフォルダ構造を持っていると仮定すると( from future import absolute_imports付き)のpython 2とPython 3

ために起こります​​モジュール。

import argparse 
print(argparse) 
from mypackage.argparse import foo 
print(argparse) 

結果は、私が期待するものです::

<module 'argparse' from '/usr/lib/python3.5/argparse.py'> 
<module 'argparse' from '/usr/lib/python3.5/argparse.py'> 

しかし、私は私のパッケージから機能を実行し、同じインポートを実行するために私のスクリプトを変更した場合、私のスクリプト内で、私は次のコードを実行しますそして、私のパッケージの__init__.pyでprint文、すなわち:

スクリプト:

from mypackage import main 
main() 

__init__.py:結果

import argparse 
print(argparse) 
from mypackage.argparse import foo 
print(argparse) 

def main(): 
    pass 

は、私が参照してください。

<module 'argparse' from '/usr/lib/python3.5/argparse.py'> 
<module 'mypackage.argparse' from '/tmp/test/src/mypackage/argparse.py'> 

なぜ、このケースではありません(とされていない他のいずれかで)from X import Yステートメントは、ローカルに​​の前の世界的な輸入を上書きモジュール?

答えて

1

サブモジュールにアクセスする方法を考えてみると、サブモジュール「mypackage」にアクセスするには、mypackage.argparseと書いてください。

ここで、モジュールの属性ルックアップがどのように機能するかを考えて、モジュールのグローバル名前空間内の属性を検索します。

これら2つを組み合わせると、サブモジュールにアクセスする唯一の方法は、それらをパッケージのグローバル名前空間に追加することです。これは意図した動作です。

+0

これはどこかで文書化されていますか?私はこれが絶対的な輸入で得られた利益の50%を役に立たないと感じている。 – languitar

+0

[パッケージに関するドキュメント](https://docs.python.org/3/tutorial/modules.html#packages)には、多くの点で「__init __。py」woksの仕組みが説明されていません。 :/ –

+0

ありがとう、ありがとう。だから私は、argparseがXからの後に輸入されることを保証するために、私の輸入品を珍しい方法で整理することを別にして、これに対処する機会はない。 – languitar

関連する問題