Несмотря на то, что многие уже рассказывали о import
противостоянии 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()
укажите пространство имен с помощью 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
Хорошо, давайте проверим, как это выглядит в словах 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'
>>>