2012-08-14 14 views
12

私はこのパッケージがあります。のpython - 同じディレクトリ内のモジュールのための絶対的な輸入

mypackage/ 
    __init__.py 
    a.py 
    b.py 

をそして、私はモジュールBにモジュールAから物事をインポートするには、それが

bのモジュールで書いても意味がありません
from mypackage.a import * 

または私はちょうど両方のオプションが動作します

from a import * 

を使用する必要があり、私はちょうど第二作る(優れていると思いましてそれは同じレベルだからですが、衝突を避けるために、たとえばシステムがa.pyという名前のファイルを含むフォルダから実行している場合など、第1の方法を検討しています。

答えて

6

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

spamという名前のモジュールをインポートする

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

  • 入力スクリプト(またはカレントディレクトリ)を含むディレクトリ。
  • PYTHONPATH(ディレクトリ名のリスト、
  • シェル変数PATHと同じ構文)。
  • インストールに依存するデフォルトです。

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

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

Python style guidelinesは、相対的な輸入品を使用することはお勧めしません:パッケージ内の輸入のための

相対輸入は非常に落胆しています。 すべてのインポートに常に絶対パッケージパスを使用してください。 PEP 328がPython 2.5で完全に実装されているにもかかわらず、明示的な のスタイルのスタイルは積極的に推奨されません。絶対的な輸入は、より多くの可搬性があり、通常はより読みやすい です。

python 2.5以降、intra-package relative importsの新しい構文が導入されました。現在、.は現在のモジュールを指し、..はモジュールを1レベル上に示します。

from . import echo 
from .. import formats 
from ..filters import equalizer 
+3

「本当に何かが組み込みのものと衝突していないことは、どうやって知っていますか?暗黙の相対的輸入は、理由のために殺された、彼らは安全ではない。 – MatthewWilkes

+0

あなたが正しいです、組み込みのモジュールは、私たちのものが同じ名前を持つものでマスクされます。 –

+0

"Pythonスタイルのガイドラインでは、最初のアプローチを推奨していません。" 私には、最初にお勧めするようです。 "すべてのインポートに常に絶対パッケージパスを使用してください" – banana

5

from mypackage.a import things, you, wantを使用してください。

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

もう1つは、他のコードを隠す可能性があるため、import *を避けるべきことです。 a.pyファイルにsumという名前の関数があるとどうなりますか?それは静かに組み込みのものを無効にします。これは、変数や関数名を再利用している可能性があるので、他のモジュールで独自のコードをインポートするときに特に悪いことです。

したがって、必要な機能だけをインポートしてください。あなたのソースコードにpyflakesを使用すると、競合の可能性があるときに警告が表示されます。

+2

+1。 btw、 'from __future__ import absolute_import'もPython 2.5でも動作します。 – jfs

関連する問題