1. ホーム
  2. python

[解決済み] import os.path` と `import os` のどちらを使うべきですか?

2022-05-01 05:21:59

質問

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

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

または...

# Is importing os enough?
import os

インポートについてお答えください。 os が動作するようになりました。私も今現在(Python 2.6時点)、動作していますよ。私が知りたいのは、この問題についての公式な推奨事項です。だから、あなたがこの質問に答えるなら、お願いします 参考文献を掲載する .

解決方法は?

os.path はおかしな動作をします。それは次のように見えます。 os はパッケージで、サブモジュールの path が、実際には os は、通常のモジュールで sys.modules を注入するために os.path . 以下はその様子です。

  • Pythonが起動するとき、モジュールの束を sys.modules . しかし、何らかの方法でモジュールをインポートすると、既に作成されているモジュールにアクセスすることができます。

    • sys.modules は、モジュールがキャッシュされるディクショナリです。モジュールをインポートするとき、すでにどこかでインポートされていれば sys.modules .
  • os は、Pythonの起動時にロードされるモジュールの一つです。これはその path 属性は、os 固有のパスモジュールになります。

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

を考えることが多いのですが os.path として 使いたいモジュール よりも にあるもの。 os モジュール ということで、たとえ 本当に というパッケージのサブモジュールです。 os というようにインポートしています。 私はいつも 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プロジェクトはこのアプローチを取っていて、より構造化されたコードを作る傾向があります。