22 марта 2016 г.

Python - Пример импортирования пакета


Рассмотрим практический пример программного кода, который демонстрирует, как используются файлы инициализации и пути к каталогам. Следующие три файла располагаются в каталоге dir1 и в подкаталоге dir2 – комментарии описывают пути к этим файлам:
# Файл: dir1\__init__.py
Print(‘dir1 init’)
x = 1

# Файл: dir1\dir2\__init__.py
Print(‘dir2 init’)
y = 2

# Файл: dir1\dir2\mod.py
Print(‘in mod.py’)
z = 3
В данном случае каталог dir1 может быть подкаталогом нашего рабочего каталога (то есть домашнего каталога программы) или подкаталогом одного из каталогов, перечисленных в пути поиска модулей (технически, входящего в список sys.path). В любом из этих случаев для каталога, вмещающего подкаталог dir1, не требуется наличие файла __init__.py.
Инструкции  import  выполняют  файлы  инициализации  в  каждом  каталоге, которые присутствуют в пути к модулю, – инструкции print, присутствующие в этих файлах, позволят отследить их выполнение. Кроме того, как и файлы модулей, уже импортированные каталоги могут передаваться функции reload для  принудительного  повторного  исполнения  этого  единственного  элемента.
Как показано ниже, для повторной загрузки каталогов и файлов функция reload также может принимать цепочку имен, разделенных точками:


>>> import dir1.dir2.mod       # Сначала запускаются файлы инициализации
dir1 init
dir2 init
in mod.py
>>>
>>> import dir1.dir2.mod       # Повторное импортирование не выполняется
>>>
>>> from imp import reload     # Требуется в версии 3.0
>>> reload(dir1)
dir1 init
<module ‘dir1’ from ‘dir1\__init__.pyc’>
>>>
>>> reload(dir1.dir2)
dir2 init
<module ‘dir1.dir2’ from ‘dir1\dir2\__init__.pyc’>
После операции импортирования путь, указанный в инструкции import, становится цепочкой вложенных объектов. Здесь mod – это объект, вложенный в объект dir2, который в свою очередь вложен в объект dir1:
>>> dir1
<module ‘dir1’ from ‘dir1\__init__.pyc’>
>>> dir1.dir2
<module ‘dir1.dir2’ from ‘dir1\dir2\__init__.pyc’>
>>> dir1.dir2.mod
<module ‘dir1.dir2.mod’ from ‘dir1\dir2\mod.pyc’>
Каждый каталог в пути фактически становится переменной, которой присваивается объект модуля, пространство имен которого инициализируется всеми инструкциями присваивания в файле __init__.py, находящемся в этом каталоге. Имя dir1.x ссылается на переменную x, которой присваивается значение 
в файле dir1\__init__.py, точно так же, как имя mod.z ссылается на переменную 
z, которой присваивается значение в файле mod.py:
>>> dir1.x
1
>>> dir1.dir2.y
2
>>> dir1.dir2.mod.z

3


Комментариев нет:

Отправить комментарий