2016-05-24 9 views
3

私が学生のスクリプトに次のように見て、私の驚きに、それは動作します:Pythonはマルチセグメントインポートで余分なことをしますか?

>>> import os.path 

質問は、簡単に、次のとおりです。これは、単純なimport osから異なり、どのように?それとも、同じですか?os.pathが存在することを除いては同じですか?

ご覧のとおり、pathは私の範囲ではありませんが、osと定義されています。

>>> dir() 
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os'] 

質問:これはPythonとは何ですか?確かに、それはモジュールosをインポートします(したがって実行します)。また、os.pathが有効なものに解決されることを保証します。 (@Leeと@Stuartのおかげでそれを確認するドキュメントへのリンクがあります)。またはimport pkg.submodは常にimport pkgと等価です(pkg.submodが存在します)?

osをインポートすると、すでにosがインポートするモジュールがインポート/実行されます。したがってos.pathが既にロードされています。 pkg.submodをインポートすると、pkgをインポートするだけではなく、異なるコードが実行されたり、異なる順序で、または異なる副作用が生じる可能性があります(エキゾチックではありません)。そして、マルチセグメント形式の正当なユースケースはありますか? (言い換えるするには、次のポイントは何ですか?)

+0

関連ドキュメントがここにHTTPSです://docs.python .org/3.5/tutorial/modules.html#packages – Stuart

+2

'os.path'は、その名前で実際のサブモジュールが存在しないため、特殊なケースです。 os自身は 'posixpath'または' ntpath'を 'path'として適切にインポートします。 –

答えて

3

docsから:

[モジュールの完全修飾名]は、インポート検索の様々な段階で使用され、それ であってもよいですサブモジュールへの点線のパス、例えばfoo.bar.baz。この場合、 Pythonはまずfoo、次にfoo.bar、そして最後に foo.bar.bazをインポートしようとします。いずれかの中間インポートが失敗すると、ImportError が発生します。だから、

、あなたの元の質問に答えるために、osが有効なパッケージであれば、その後、全体モジュールがインポートされているようです。したがって、サブモジュールフォームは、モジュールos.pathをインポートするのではなく、osモジュール内にos.pathが存在することを検証するために使用されます。

あなたがにしたい場合のみpathモジュールをインポートし、その後、あなたはfrom ... import ...構文を使用することができます。

>>> from os import path 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'path'] 

も参照してください:from … import vs import .

+0

モジュール全体が確実にインポートされます。申し訳ありませんが、私はそれが分かっていることを明確にしていませんでした。問題はそこに他にどのような影響があるかということです。違いはありますか?私が 'os'をインポートしただけでは、' os'のインポートをすべてインポートしていないので、 'path'もインポートしていますか? – alexis

+0

はい、 'import os.path'は' os'モジュール内に 'path'が存在することを検証するために使うことができます。そうでなければ、' ImportError'を送出します。 –

関連する問題