Незважаючи на те, що багато людей вже пояснювали про importvs 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'
>>>