5

パッケージPを作成します。Pのルートにモジュールm0があります。Pのどこかに、m0からインポートする必要のあるモジュールm1、m2、...があります。

もちろん、これらの各モジュールに書き込むことができます。

from P.m0 import ...

ただし、PIの名前を変更した場合は、すべての場所に再度アクセスして、そのようなステートメントを書き直す必要があります。

相対インポートを使用することもできますが、パッケージ階層の別のレベルにモジュールを移動する場合は、ドットの数を修正する必要があります。

他にもいくつかの理由がありますが、結論として、パッケージのルートにあるモジュールm0からインポートすると言いたいのですが、これを表現するための最良の方法は何ですか?

4

2 に答える 2

2

それは可能ではありません。

ただし、サブパッケージ間でモジュールを移動する主要なリファクタリングを実行する場合、いくつかの相対的なインポートを更新する必要があることは大きな問題ではありません。

相対インポートを使用しない場合は、トップレベルのパッケージ名の名前を変更する場合にも同じことが当てはまります。これは、すべてのファイルを検索して置換することで、非常に高速に実行できます。

于 2012-04-21T19:42:45.597 に答える
0

質問を少し変更しても構わないと思っている場合は、これを回避できます。

パッケージへの唯一のエントリポイントが制御されている場合。testsuite package/.../module.pyたとえば、呼び出しのようなことをしてコードをテストするだけです。

import firstthing次に、最初に行うことはであり、package/firstthing.py には次のものがあることを確認できます。

import sys
import os.path
packageDir = os.path.split(__name__)[0]
sys.path[:] = sys.path+[packageDir]  # or maybe you want it first...

主な注意点は、エントリポイントを通過しないと python ファイルを実行できないことです。Python で作成するすべてのプロジェクトで常にこれを実行したいと思っていますが (相対インポートを適切に機能させるため)、個人的にはこれは非常に不便であり、あきらめました。


2 番目の選択肢もあります。パッケージが python パスで別のパッケージを必要とすることを指定することは、それほど不合理はありません。このパッケージは、主要なハッキングを実行するユーティリティ パッケージである可能性があります。たとえば、パッケージの名前が「x」のimport x場合、インスペクト モジュールを使用してインタプリタ スタックでリフレクションを実行し、インポート元のモジュールを特定できます。次に、パッケージのルートが見つかるまで (特別なインジケーター ファイルやマニフェストなどをチェックして) 親ディレクトリを上って、一種の「os.walk の逆方向」を実行できます。次に、コードは、Pythonパスの上記の変更をプログラムで実行しますsys.path. 上記と同じですが、ひどいエントリポイントを通過することなく、任意の python ファイルを実行するなどの操作を自由に行うことができます。

シェル環境を完全に制御できる場合は、$PYTHONPATH を拡張してパッケージ ディレクトリを含めることもできますが、これは多くの点で非常に脆弱であり、むしろ洗練されていません。

于 2012-04-21T19:48:02.103 に答える