14

私はこのパッケージを持っています:

mypackage/
    __init__.py
    a.py
    b.py

そして、モジュールaからモジュールbに物をインポートしたいのですが、モジュールbに書くのは理にかなっていますか

from mypackage.a import *

または私はちょうど使用する必要があります

from a import *

両方のオプションが機能します。どちらが優れているのか疑問に思っています(2番目は同じレベルにあるため理にかなっていますが、衝突を避けるために1番目を検討しています。たとえば、システムがという名前のファイルを含むフォルダーから実行されている場合) a.py)。

4

2 に答える 2

7

衝突がないはずなので、番号 2 を安全に使用できます。現在のパッケージと同じパッケージから常にモジュールをインポートします。モジュールが標準ライブラリ モジュールの 1 つと同じ名前の場合、標準モジュールの代わりにインポートされることに注意してください。ドキュメントから:

という名前のモジュールspamがインポートされると、インタープリターは最初にその名前の組み込みモジュールを検索します。見つからない場合はspam.py、変数で指定されたディレクトリのリストで指定されたファイルを検索しますsys.pathsys.path次の場所から初期化されます。

  • 入力スクリプトを含むディレクトリ (または現在のディレクトリ)。
  • PYTHONPATH(ディレクトリ名のリスト。
  • シェル変数PATH)。
  • インストールに依存するデフォルト。

初期化後、Python プログラムは を変更できsys.pathます。実行中のスクリプトを含むディレクトリは、標準ライブラリ パスの前の検索パスの先頭に配置されます。これは、ライブラリ ディレクトリ内の同じ名前のモジュールの代わりに、そのディレクトリ内のスクリプトが読み込まれることを意味します。意図した置換でない限り、これはエラーです。詳細については、セクション標準モジュールを参照してください。

このオプションfrom mypackage.a import *は、プロジェクト全体で一貫性の理由から使用できます。一部のモジュールでは、とにかく絶対インポートを行う必要があります。したがって、モジュールが同じパッケージに含まれているかどうかを考える必要はなく、プロジェクト全体で統一されたスタイルを使用するだけです。さらに、このアプローチはより信頼性が高く、予測可能です。

Python スタイル ガイドラインでは、相対インポートの使用は推奨されていません。

パッケージ内インポートの相対インポートはお勧めできません。すべてのインポートには、必ず絶対パッケージ パスを使用してください。PEP 328が Python 2.5 で完全に実装された今でも 、明示的な相対インポートのスタイルは積極的に推奨されていません。絶対インポートは移植性が高く、通常は読みやすいです。

Python 2.5 以降、パッケージ内相対インポートの新しい構文が導入されました。.これで、現在のモジュールを..参照し、1 レベル上にあるモジュールを参照できます。

from . import echo
from .. import formats
from ..filters import equalizer
于 2012-08-14T12:11:26.100 に答える
5

を使用する必要がありますfrom mypackage.a import things, you, want

ここには 2 つの問題があります。主なものは相対インポートと絶対インポートであり、そのセマンティクスは Python 3 で変更され、インポートを使用して Python 2.6 および 2.7 でオプションで使用できます__future__。mypackage.a を使用することで、実際に必要なコードが得られることが保証され、Python の将来のバージョンで確実に動作します。

2 つ目は、他のコードをマスクする可能性があるため、import * を避ける必要があることです。a.py ファイルに という関数が追加されたらどうなるsumでしょうか? 組み込みのものを静かにオーバーライドします。これは、変数名や関数名を再利用している可能性があるため、他のモジュールに独自のコードをインポートする場合に特に悪いことです。

したがって、必要な特定の関数のみをインポートする必要があります。ソースコードで pyflakes を使用すると、潜在的な競合がある場合に警告が表示されます。

于 2012-08-14T12:15:40.043 に答える