151

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

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

または...

# Is importing os enough?
import os

os「私のために作品をインポートする」と答えないでください。私は知っています、それは今私にとってもうまくいきます(Python2.6の時点で)。私が知りたいのは、この問題に関する公式の推奨事項です。したがって、この質問に答える場合は、参考文献を投稿してください

4

6 に答える 6

176

os.path面白い方法で動作します。osサブモジュールを含むパッケージのように見えますpathが、実際osには、sys.modulesを注入するために魔法をかける通常のモジュールですos.path。何が起こるかです:

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

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

  • サブモジュールであるかのようにsys.modules['os.path'] = path「」を実行できるように注入します。import os.path

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


ちなみに、この種の構造は、モジュールとパッケージ、およびコード編成について多くのPythonプログラマーが初期の混乱を招くことにつながると思います。これは本当に2つの理由によるものです

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

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

于 2010-04-27T21:14:58.573 に答える
30

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

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

于 2010-04-27T20:00:04.470 に答える
15

決定的な答え:import osそして使用しますos.pathimport 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).
...
于 2013-04-26T09:43:04.197 に答える
9

興味深いことに、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

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

于 2010-04-27T19:45:46.883 に答える
6

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

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

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

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

    import os
    import os.path
    

参考のために:

于 2018-09-06T17:33:33.427 に答える
4

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

于 2010-04-27T19:52:21.570 に答える