13 июня 2013 г.

Как работает импорт

В предыдущих постах говорилось об импортировании модулей, но никак не объяснялось, что происходит во время импорта.  Так как в языке Python  инструкции импортирования составляют основу структуры программы, в  этом разделе  более  подробно будет  рассмотрена  операция импорта, чтобы  сделать представление об этом процессе менее абстрактным.


Некоторые  программисты на языке C  любят  сравнивать  инструкцию  import
в языке Python с инструкцией #include, но они в корне неправы – импортирование в языке Python – это не просто включение текста одного файла в другой. Это самые настоящие операции времени выполнения, которые выполняют следующие действия, когда программа впервые импортирует заданный файл:
1.  Отыскивают файл модуля.
2.  Компилируют в байт-код (если это необходимо).
3.  Запускают программный код модуля, чтобы создать объекты, которые он
определяет.

Чтобы  лучше понять, как  протекает  импорт модулей, мы исследуем все эти действия по  порядку.  Примите во внимание, что все три  действия  выполняются, только когда модуль впервые импортируется во время выполнения программы, – все последующие операции импорта того же модуля пропускают эти действия и просто выбирают уже находящийся в памяти объект модуля. Технически это обеспечивается за счет того, что интерпретатор сохраняет информацию о загруженных модулях в словаре с именем sys.modules и проверяет его
при выполнении каждой операции импортирования. Если модуль отсутствует
в словаре, выполняется трехэтапный процесс, описанный выше.

1. Поиск
Прежде всего, интерпретатор должен определить местонахождение файла модуля, указанного в инструкции import. Обратите внимание, что имена файлов в  инструкции import  в  примерах  из  предыдущих  разделов указаны без расширения .py и без пути к каталогу: вместо записи в виде, например, import c:\ dir1\b.py,  инструкция записывается  просто  –  import  b.  Фактически  допускается указывать лишь простые имена – путь к каталогу и расширение файла должны быть опущены, потому что для поиска файла, соответствующего имени, указанному в инструкции import, интерпретатор использует стандартный путь поиска модулей.1 Поскольку это основная часть операции импорта, которую необходимо знать программистам, мы вернемся к ней чуть ниже.

2. Компиляция (если необходимо)
После  того как в пути поиска модулей будет найден  файл, соответствующий
имени в инструкции import, интерпретатор компилирует его в байт-код, если
это необходимо.

Интерпретатор проверяет время создания файла и пропускает этап компиля-
ции исходного программного кода, если файл с байт-кодом .pyc не старше, чем
соответствующий ему файл .py с исходным текстом. Кроме того, если Python
обнаружит в пути поиска только файл с байт-кодом и не найдет файл с исход-
ным текстом, он просто загрузит  байт-код  (это означает, что вы можете  рас-
пространять свою программу исключительно в виде файлов с байт-кодом и не
передавать файлы с исходными текстами).  Другими словами, этап компиля-
ции пропускается, если можно ускорить запуск программы. Если вы измените
исходный  программный  код,  Python  автоматически  скомпилирует  байт-код
при следующем запуске программы.

3. Запуск
На последнем шаге операции импортирования производится запуск байт-кода
модуля.  Все  инструкции  в  файле  модуля  выполняются  по  порядку,  сверху
вниз, и любые операции присваивания, которые встретятся на этом шаге, бу-
д ут создавать атрибуты конечного объекта модуля. Таким образом, этот этап
выполнения создает все инструменты, которые определяются модулем. Напри-
мер, во время импортирования выполняются инструкции def в файле, которые
создают функции и присваивают их атрибутам модуля. После этого функции
могут вызываться из программы, выполнившей импорт.



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

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