web-dev-qa-db-ja.com

「import os.path」または「import os」を使用する必要がありますか?

公式ドキュメント によれば、os.pathはモジュールです。したがって、それをインポートする好ましい方法は何ですか?

# Should I always import it explicitly?
import os.path

または...

# Is importing os enough?
import os

osをインポートしてもうまくいきません」と答えないでください。私も知っている、それは今でも私のために働く(Python 2.6現在)。私が知りたいのは、この問題に関する公式の勧告です。したがって、この質問に答える場合は、参照を投稿してください

129

os.pathは面白い方法で動作します。 osはサブモジュールpathを含むパッケージであるように見えますが、実際にはossys.modulesを使用してos.pathを挿入する通常のモジュールです。発生することは次のとおりです。

  • Pythonが起動すると、多数のモジュールをsys.modulesにロードします。これらはスクリプト内のどの名前にもバインドされていませんが、何らかの方法でそれらをインポートすると、作成済みのモジュールにアクセスできます。

    • sys.modulesは、モジュールがキャッシュされる辞書です。モジュールをインポートするときに、すでにどこかにインポートされている場合は、sys.modulesに格納されているインスタンスを取得します。
  • osは、Pythonの起動時にロードされるモジュールの1つです。 path属性をOS固有のパスモジュールに割り当てます。

  • sys.modules['os.path'] = pathを挿入するため、サブモジュールであるかのように "import os.path"を実行できます。

os.pathは、osモジュール内のものではなく使用したいモジュールと考える傾向があるため、reallyosと呼ばれるパッケージのサブモジュール、私はそれを1つであるようにインポートします私は常にimport os.pathを行います。これは、os.pathの文書化方法と一致しています。


ちなみに、この種の構造は、モジュールやパッケージ、コードの編成に関するPythonプログラマーの初期の混乱につながると思います。これには、2つの理由があります

  1. osをパッケージと考え、import osを実行でき、サブモジュールos.pathにアクセスできることがわかっている場合、後でimport twistedを実行できず、インポートせずにtwisted.spreadに自動的にアクセスできない場合は驚かれるかもしれません。

  2. os.nameが通常の文字列であり、os.pathがモジュールであることは紛らわしいです。パッケージは常に空の__init__.pyファイルで構成されているため、同じレベルで常に1つのタイプのモジュール/パッケージまたはその他のものがあります。いくつかの大きなPythonプロジェクトはこのアプローチを採用しており、より構造化されたコードを作成する傾向があります。

148
Mike Graham

PEP-2 Tim Petersによると、「明示的は暗黙的よりも優れています」および「可読性カウント」です。 osモジュールから必要なものがos.pathの下にある場合、import os.pathはより明確になり、他の人にあなたが本当に気にかけていることを知らせます。

同様に、PEP-20は「単純なものは複雑なものより優れている」とも言っているため、より一般的なos傘の下にあるものも必要な場合は、import osが優先されます。

29
Nick T

決定的な答え:import osおよびos.pathを使用します。 import os.pathを直接しないでください。

モジュール自体のドキュメントから:

>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path.  The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
16
lesmana

興味深いことに、os.pathをインポートすると、すべてのosがインポートされます。対話型プロンプトで次を試してください。

import os.path
dir(os)

結果は、osをインポートした場合と同じになります。これは、os.pathが使用しているオペレーティングシステムに基づいて異なるモジュールを参照するためです。したがって、pythonはosをインポートして、パスにロードするモジュールを決定します。

参照

一部のモジュールでは、import foofoo.barを公開しないと言うので、特定のモジュールの設計に本当に依存していると思います。


一般に、必要な明示的モジュールをインポートするだけで、わずかに速くなるはずです。私のマシンで:

import os.path7.54285810068e-06 seconds

import os9.21904878972e-06 seconds

これらの時間は、ごくわずかであるほど十分に近いです。プログラムは、現在または後でosから他のモジュールを使用する必要がある場合があるため、通常は2マイクロ秒を犠牲にしてimport osを使用して後でこのエラーを回避するのが理にかなっています。私は通常、osを全体としてインポートすることに賛成していますが、技術的に効率的でosモジュールの唯一の部分であるコードの読者に伝えるためにimport os.pathを好む理由を見ることができます使用する必要があります。本質的には、私の頭の中のスタイルの質問に要約されます。

6
Matt Boehm

ここでは常識が働きます:osはモジュールであり、os.pathもモジュールです。使用したいモジュールをインポートするだけです:

  • osモジュールの機能を使用する場合は、osをインポートします。

  • os.pathモジュールの機能を使用する場合は、os.pathをインポートします。

  • 両方のモジュールで機能を使用する場合は、両方のモジュールをインポートします。

    import os
    import os.path
    

参考のため:

4
Cyker

明確な参照は見つかりませんでしたが、 os.walk のサンプルコードではos.pathを使用していますが、osのみをインポートしていることがわかります。

4
Chris Hulan