多くの人がimport
vs についてすでに説明しましたがimport from
、私はフードの下で何が起こるか、そしてそれが変わるすべての場所がどこにあるかについてもう少し説明したいと思います。
import foo
:
foo
現在のネームスペースにそのモジュールへの参照をインポートして作成します。次に、完成したモジュールパスを定義して、モジュール内から特定の属性またはメソッドにアクセスする必要があります。
たとえばfoo.bar
ではなくbar
from foo import bar
:
foo
リストされたすべてのメンバーへの参照をインポートして作成します(bar
)。変数を設定しませんfoo
。
例えばbar
なく、baz
またはfoo.baz
from foo import *
:
foo
現在の名前空間でそのモジュールによって定義されたすべてのパブリックオブジェクトへの参照をインポートおよび作成します(存在する__all__
場合__all__
は、にリストされているすべて、それ以外の場合はで始まらないすべて_
)。変数を設定しませんfoo
。
たとえばbar
、またはでbaz
はなく。_qux
foo._qux
では、いつ実行するか見てみましょうimport X.Y
。
>>> import sys
>>> import os.path
sys.modules
名前os
とチェックos.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
確認globals()
とlocals()
名前空間のdictsとos
とos.path
:
>>> globals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> locals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> globals()['os.path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os.path'
>>>
上記の例から、os
ローカルとグローバルの名前空間にのみ挿入されることがわかりました。したがって、以下を使用できるはずです。
>>> os
<module 'os' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> os.path
<module 'posixpath' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
しかし、そうではありませんpath
。
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
あなたが削除するとos
地元の人々から()名前空間を、あなたがアクセスすることはできませんos
としてだけでなくos.path
、彼らはsys.modulesに存在するにもかかわらず:
>>> del locals()['os']
>>> os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
それでは話しましょうimport from
:
from
:
>>> import sys
>>> from os import path
およびで確認sys.modules
してください:os
os.path
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
をsys.modules
使用して、以前と同じように見つけたことがわかりましたimport name
OK、それがどのように見えるか、locals()
そしてglobals()
名前空間ディクテーションをチェックしましょう:
>>> globals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> locals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['os']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os'
>>>
あなたはではpath
なく名前を使ってアクセスできますos.path
:
>>> path
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
から「パス」を削除しましょうlocals()
:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
エイリアスを使用した最後の例:
>>> from os import path as HELL_BOY
>>> locals()['HELL_BOY']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['HELL_BOY']
<module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
そしてパスが定義されていません:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>