1

次のディレクトリ構造を持つpythonパッケージを設計しています

package\  
    __init__.py  
    subpackage1\  
        __init__.py  
        module1.py  
        module2.py    
    subpackage2\
        __init__.py  
        module3.py

ユーザーが ipython でパッケージをインポートするときに、タブ補完を使用してディレクトリ構造を反映したクリーンな名前空間を探索できるようにしたいと考えています。

たとえば、実行した後

import package as pkg

pkg でタブ補完が必要です。を表示pkg.subpackage1 pkg.subpackage2し、タブで補完しpkg.subpackage1ます。表示するpkg.subpackage1.module1 pgk.subpackage1.module2。これらのモジュールの一部は相互に依存しており、import statements.

たとえばmodule1.py

from ..subpackage2 import module3

ただし、誰かpkg.subpackage1.module1.module3import pkg.subpackage1.module1.

さらに、人々がそうするとき、import pkg.subpackage1.module1私はタブ補完をしたくありませんpkg.subpackage1.module1。内部例外クラスや、numpy を module1 に np としてインポートしたという事実などを表示します。つまり、module1 での module3 の使用と、numpy を np として使用することをユーザーから隠したいと考えています。import numpy as _npのようなものを使用しfrom ..subpackage2 import module3 as _module3て、これを行うための最良の方法はありますか?

見られたくないものすべてにアンダースコアを追加する必要がありますか?

明確にするために、ファイル scipy.integrate.quadrature に行があることを scipy ソース コードで確認できますが、ipythonimport numpy as npで実行すると、import scipyタブで scipy.integrate.quadrature に移動でき、np が表示されません。

4

1 に答える 1

1

package/__init__.py、以下を含めます。

import subpackage1
import subpackage2

これにより、いつでも確実packageにインポートされ、 もインポートsubpackageXされpackage.subpackageXます。

あなたsubpackageX/__init__.pyには何も含まれていません。したがって、package.subpackageX.moduleX定義済みを取得するには、明示的にインポートする必要があります (例: from package.subpackage1 import module1)

アンダースコアアプローチを採用する場合、ipython では、アンダースコアで始まる名前をタブで補完できることに注意してくださいpackage.subpackage1._<TAB>

編集:

他の選択肢:

  1. subpackage1/__init__.py、公開したい名前をインポートしますfrom .module1 import x,ypackage.subpackage1.xそれはそれらをではなくとして定義します package.subpackage1.module1.x
  2. __all__ディレクティブを使用して名前を定義します。これはタブ補完には影響しませんが、インポーターが何に関心を持つべきかを宣言的に伝える方法になります。このようにして、彼らもできますfrom package.subpackage1 import *
于 2013-05-10T04:25:06.993 に答える