Глава 6. Модули
238
определяется на основании внутренней временной метки файла, содержащего байт-
код, а не даты, записанной в файловой системе), то Python повторно не компилирует
модуль.
Получив файл с байт-кодом, созданный посредством компиляции или прочитан-
ный из файловой системы, Python выполняет тело модуля для инициализации объ-
екта модуля. Если модуль является расширением, Python вызывает функцию иници-
ализации модуля.
Основная программа
Обычно выполнение приложения Python начинается со сценария верхнего уров-
ня, также называемого основной программой (см. раздел “Программа python” в гла-
ве 2). Основная программа выполняется подобно любому другому загружаемому мо-
дулю, за исключением того, что Python сохраняет скомпилированный байт-код в па-
мяти, но не сохраняет на диске. Модуль основной программы всегда носит одно и то
же имя — '__main__', хранящееся как в глобальной переменной __name__ (атрибут
модуля), так и в виде ключа в словаре sys.modules.
Не импортируйте .py-файл, который используете в качестве основной
программы
Не следует импортировать тот же .py-файл, который является основ-
ной программой. Если вы сделаете это, то модуль загрузится вновь
и его тело выполнится еще раз с самого начала в отдельном объекте
модуля с другим значением атрибута __name__.
Код модуля Python может протестировать, является ли используемый модуль ос-
новной программой, проверив, имеет ли глобальная переменная __name__ значение
'__main__'. Показанную ниже идиому часто используют для защиты кода, чтобы он
выполнялся только в том случае, если модуль запускается в качестве основной про-
граммы.
if __name__ == '__main__':
Если модуль предназначен только для импортирования, он должен нормально
проходить блочные тесты, когда выполняется в качестве основной программы (раз-
дел “Модульное и системное тестирование” в главы 16).
Do'stlaringiz bilan baham: |