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