回答:
os.path
面白い方法で動作します。それはos
サブモジュールを持つパッケージのように見えますpath
が、実際にos
は、sys.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
モジュール、それはありませんので、にもかかわらず、本当にというパッケージのサブモジュールos
、私はそれが1であるように、一種のそれをインポートして、私はいつもやりますimport os.path
。これは、os.path
文書化されている方法と一致しています。
ちなみに、この種の構造は、多くのPythonプログラマーがモジュールとパッケージ、およびコード編成について多くの初期の混乱を招くと思います。これには2つの理由があります
os
パッケージと考えimport os
て、サブモジュールを実行してアクセスできることがわかっている場合os.path
、インポートせずに実行できずimport twisted
、自動的にアクセスできないことに驚かれるかもしれませんtwisted.spread
。
これはos.name
通常のことであり、文字列でありos.path
、モジュールです。私は常にパッケージを空の__init__.py
ファイルで構造化しているため、同じレベルで常に1種類のものが存在します。それは、モジュール/パッケージまたはその他のものです。いくつかの大きなPythonプロジェクトはこのアプローチを採用しており、より構造化されたコードを作成する傾向があります。
import os.path
自分でやって、それがより良い方法だと思います。「これはos.pathがどのようにドキュメント化されているかと一貫しています」ということは、docs.python.org/library/os.path.htmlにあるドキュメントで独自のページが与えられることを意味しました。
Tim PetersによるPEP-20によると、「明示的なものは暗黙的なものよりも優れています」と「読みやすさの数」。os
モジュールから必要なものがすべての下にあるos.path
場合import os.path
は、より明確にして、あなたが本当に気にしていることを他の人に知らせます。
同様に、PEP-20も「シンプルな方が複雑な方がいい」と言っているので、より一般的なos
傘の下にあるものも必要な場合は、こちらをお勧めしますimport os
。
import os
意味のある方法で「シンプル」であることが本当にどうであるかはわかりません。単純な!=短い。
import os
、そしてimport os.path
あなたが例えば必要があるなら、それはダフですos.getcwd()
os.path.isfile()
決定的な答え: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).
...
os.path
存在しないモジュールのドキュメントではなく、のドキュメントであることに注意してくださいposixpath
。
"Instead of importing this module directly, import os and refer to this module as os.path."
に位置しているposixpath.py
(またはmacpath.py
、 ntpath.py
など)。それらが意味することは、import posixpath
(うまくいく)べきではなくos
、より良い移植性のために経由でモジュールをインポートするべきだということだと私はかなり確信しています。私は、彼らがいるかどうかに勧告を与えるつもりはないと思うimport os
か、import os.path
好ましいです。
興味深いことに、os.pathをインポートすると、すべてのosがインポートされます。対話型プロンプトで次のことを試してください。
import os.path
dir(os)
結果は、単にosをインポートした場合と同じになります。これは、os.pathが、使用しているオペレーティングシステムに基づいて別のモジュールを参照するため、Pythonがosをインポートして、パスに読み込むモジュールを決定するためです。
一部のモジュールでは、「import foo
公開しない」と言っているfoo.bar
ので、実際には特定のモジュールの設計に依存していると思います。
一般に、必要な明示的なモジュールをインポートするだけで、わずかに速くなるはずです。私のマシンでは:
import os.path
: 7.54285810068e-06
秒
import os
: 9.21904878972e-06
秒
これらの時間はかなり無視できるほど十分に近いです。プログラムはos
、現在または後で他のモジュールを使用する必要がある場合があるため、通常は2マイクロ秒を犠牲にimport os
して、後でこのエラーを回避するために使用するのが理にかなっています。私は通常、全体としてosをインポートするだけですがimport os.path
、技術的により効率的で、os
使用する必要があるモジュールの唯一の部分であるコードの読者に伝える方を好む理由を理解できます。それは本質的に私の頭の中のスタイルの質問に要約されます。
from os import path
速度に問題がある場合、pathの呼び出しがさらに速くなります。
ここでos
は常識が機能します。はモジュールでありos.path
、モジュールでもあります。したがって、使用するモジュールをインポートするだけです。
os
モジュールで機能を使用する場合は、をインポートしos
ます。
os.path
モジュールで機能を使用する場合は、をインポートしos.path
ます。
両方のモジュールで機能を使用する場合は、両方のモジュールをインポートします。
import os
import os.path
参考のため:
Lib / idlelib / rpc.pyはを使用os
してインポートしos
ます。
Lib / idlelib / idle.pyはを使用os.path
してインポートしos.path
ます。
Lib / ensurepip / init .pyは両方を使用し、両方をインポートします。