4

誰かがPythonインタープリターでのこの動作に光を当ててください:

from os import path    # success
type(path)             # <class 'module'>
from path import *     # complains that no module called 'path' exists 

type(os.path)          # complains that the name 'os' is not defined, yet:
from os.path import *  # works just fine

副次的な質問として、「from os import path」などのステートメントが機能することを可能にするメカニズムは何ですか?それでも os は未定義ですか? os は from...import の時点で実行されるのではないので、モジュールとして「認識」する必要がありますか? os を既知の名前から除外するのは、('import os' のように) 直接インポートされていないシンボルで名前空間が「汚染」されるのを防ぐための単なる規則であると言うのは正しいでしょうか?

4

1 に答える 1

3

これは Python 3 に固有のものではありません。Python 2 でも同じ問題が発生します。名前をインポートすると、それが名前空間に追加されます。それ以上のことはありません。

この行:

from path import *

意味:

「PYTHONPATH にある任意のディレクトリで呼び出されたモジュールを見つけ、pathそこからすべての名前を現在の名前空間にインポートしようとします。」

現在の作業ディレクトリにそのようなモジュールがなく、さらに重要なことに、 内のどのディレクトリにもないためPYTHONPATH、インポートは失敗します。検索では、 にあるディレクトリのサブディレクトリは検索されないことに注意してくださいPYTHONPATH

type(os.path)

os現在の名前空間に名前がないため (インポートされていないため)、この行は失敗します。

「from os import path」などのステートメントを機能させながら、まだ os が定義されていないメカニズムは何だろうか?

インポートすると、で定義されているパスのPYTHONPATH検索でモジュールが検索されます。インポートの仕組みの詳細については、effbot に関するこの記事を参照してください。

「未定義」とは、その名前が名前空間に存在しないことを意味します。

os は from...import の時点で実行されるのではないので、モジュールとして「認識」する必要がありますか?

いいえ、インポートした場合はインポートされませfrom x import yん。yx

os を既知の名前から除外するのは、('import os' のように) 直接インポートされていないシンボルで名前空間が「汚染」されるのを防ぐための単なる規則であると言うのは正しいでしょうか?

いいえ、これは真実ではありません (その理由を理解していただければ幸いです)。

于 2013-08-30T20:01:29.970 に答える