На финальном шаге операции импортирования выполняется байт-код модуля. Все операции в файле выполняются по очереди, от начала до конца, и любые присваивания именам на данном шаге генерируют атрибуты результирующего объекта модуля. Так создаются инструменты, определяемые кодом модуля. Скажем, операторы def в файле запускаются на стадии импортирования для создания объектов функций и их присваивания атрибутам внутри объекта модуля. Функции затем вызываются в файлах, импортирующих файл модуля.
Из-за того, что последний шаг импортирования фактически выполняет код файла, если любой код верхнего уровня в файле модуля делает реальную работу, то ее результаты будут видны во время импортирования. Например, операторы print верхнего уровня в модуле отображают вывод при импортировании файла. Операторы def для функций просто определяют объекты для использования в будущем.
Из-за того, что последний шаг импортирования фактически выполняет код файла, если любой код верхнего уровня в файле модуля делает реальную работу, то ее результаты будут видны во время импортирования. Например, операторы print верхнего уровня в модуле отображают вывод при импортировании файла. Операторы def для функций просто определяют объекты для использования в будущем.
Будет ли пересобран байт-код модуля module.pyc, если изменить версию Python?
Anonymous Quiz
74%
Да
26%
Нет
Байт-код сохраняется в файлах внутри того же самого каталога, где находятся соответствующие файлы исходного кода, обычно с расширением . рус (например, module.рус). Файлы байт-кода также внутренне снабжаются меткой с номером версии Python, в которой они создавались (известной разработчикам как «магическое» поле), поэтому Python известно о том, что они должны быть заново скомпилированы, когда программа запускается под управлением другой версии Python. Скажем, если вы провели модернизацию до новой версии Python, где байткод отличается, тогда все ваши файлы байт-кода автоматически перекомпилируются из-за несовпадения номеров версий даже при отсутствии каких-либо изменений в исходном коде.
Зачем нужна средовая переменная PYTHONPATH?
Anonymous Quiz
37%
Чтобы указывать путь до пакета Python
22%
Чтобы импортировать модули не только из рабочего каталога
2%
Чтобы переключаться между bash / zsh / Powershell
39%
Для всего вышеперечисленного
Устанавливать переменную среды PYTHONPATH необходимо только при импортировании
из каталогов, отличающихся от каталога, в котором вы работаете (т.е. текущего каталога при работе в интерактивной подсказке или каталога, содержащего ваш файл верхнего уровня). На практике это часто встречающийся случай для нетривиальных программ.
Пример: вы используете в своем проекте Google Tesseract — OCR-систему, и перед её использованием в файле.py необходимо прописать путь до исполняемого файла.
из каталогов, отличающихся от каталога, в котором вы работаете (т.е. текущего каталога при работе в интерактивной подсказке или каталога, содержащего ваш файл верхнего уровня). На практике это часто встречающийся случай для нетривиальных программ.
Пример: вы используете в своем проекте Google Tesseract — OCR-систему, и перед её использованием в файле.py необходимо прописать путь до исполняемого файла.
Какое название импортируемого модуля валидно?
Anonymous Quiz
6%
if
9%
some module
24%
1_module
61%
Никакое из вышеперечисленных
Из-за того, что имена модулей становятся именами переменных внутри программы Python, они также обязаны следовать обычным правилам именования переменных. Скажем, вы можете создать файл модуля по имени if.ру, но будете не в состоянии его импортировать, т.к.
На самом деле правилам именования переменных должны подчиняться как имена файлов модулей, так и имена каталогов, используемых в операциях импортирования пакетов; например, они могут содержать только буквы, цифры и подчеркивания. Кроме того, каталоги пакетов также не могут содержать синтаксис, специфичный для платформы, такой как пробелы в своих именах.
if
является зарезервированным словом — оператор import if
приведет к синтаксической ошибке. На самом деле правилам именования переменных должны подчиняться как имена файлов модулей, так и имена каталогов, используемых в операциях импортирования пакетов; например, они могут содержать только буквы, цифры и подчеркивания. Кроме того, каталоги пакетов также не могут содержать синтаксис, специфичный для платформы, такой как пробелы в своих именах.
Поскольку оператор from копирует специфические имена из одного файла в другую область видимости, он дает возможность применять скопированные имена в сценарии напрямую, не уточняя их именем модуля.
Такая форма from позволяет указывать одно или несколько имен для копирования, разделенных запятыми. Здесь оператор from имеет такой же эффект, как в предыдущем примере, но из-за того, что импортированное имя копируется в область видимости, где находится from, использование этого имени в сценарии сопряжено с меньшим объемом набора — мы можем работать с именем напрямую, не задавая включающий модуль. В действительности мы обязаны поступать так; from не создает переменную с именем самого модуля.
Оператор from на самом деле является всего лишь незначительным расширением оператора import — он импортирует файл модуля обычным образом, но добавляет дополнительный шаг, который копирует одно или большее количество имен (не объектов) из файла. Загружается целый файл, но вам предоставляются имена для более прямого доступа к его частям.
Такая форма from позволяет указывать одно или несколько имен для копирования, разделенных запятыми. Здесь оператор from имеет такой же эффект, как в предыдущем примере, но из-за того, что импортированное имя копируется в область видимости, где находится from, использование этого имени в сценарии сопряжено с меньшим объемом набора — мы можем работать с именем напрямую, не задавая включающий модуль. В действительности мы обязаны поступать так; from не создает переменную с именем самого модуля.
Оператор from на самом деле является всего лишь незначительным расширением оператора import — он импортирует файл модуля обычным образом, но добавляет дополнительный шаг, который копирует одно или большее количество имен (не объектов) из файла. Загружается целый файл, но вам предоставляются имена для более прямого доступа к его частям.
Модули загружаются и запускаются при выполнении первого оператора
В качестве одного последствия, из-за того, что код верхнего уровня в файле модуля обычно выполняется только один раз, вы можете применять его для инициализации переменных. Взгляните на содержимое файла simple.ру:
В приведенном примере операторы print и = выполняются, когда модуль импортируется в первый раз, и переменная spam инициализируется во время импортирования:
Вторая и последующие операции импортирования не выполняют код модуля повторно; они всего лишь извлекают уже созданный объект модуля из внутренней таблицы модулей Python. Таким образом, переменная spam не будет инициализироваться заново:
Если вы действительно хотите, чтобы код модуля выполнился повторно при последующей операции импортирования, это делается с помощью функции
import
или from
и только первого. Так было задумано — поскольку импортирование является затратной операцией, по умолчанию Python делает его только один раз на файл и однократно на процесс. Более поздние операции импортирования просто извлекают объект уже загруженного модуля.В качестве одного последствия, из-за того, что код верхнего уровня в файле модуля обычно выполняется только один раз, вы можете применять его для инициализации переменных. Взгляните на содержимое файла simple.ру:
print('hello')
spam = 1
В приведенном примере операторы print и = выполняются, когда модуль импортируется в первый раз, и переменная spam инициализируется во время импортирования:
# main.py
import simple # Первая операция импортирования: загружает и выполняет код файла
simple.spam = 2
Вторая и последующие операции импортирования не выполняют код модуля повторно; они всего лишь извлекают уже созданный объект модуля из внутренней таблицы модулей Python. Таким образом, переменная spam не будет инициализироваться заново:
import simple
print(simple.spam) # 2
Если вы действительно хотите, чтобы код модуля выполнился повторно при последующей операции импортирования, это делается с помощью функции
reload
.Оператор
from … *
может использоваться только на верхнем уровне файла модуля, но не внутри функции. Его присутствие там делает невозможным статическое обнаружение переменных. Вот почему в некоторых источниках рекомендуется импортировать все необходимое в начале файла.Куда в файле.py можно поместить оператор import?
Anonymous Quiz
17%
В блок try / except
4%
Внутри проверки if … else
10%
Внутри функции (после оператора def)
69%
Во все вышеперечисленные места
Подобно
def
, операторы import
и from
являются исполняемыми, а не объявляемый на стадии компиляции. Они могут вкладываться внутри проверок if
для выбора среди нескольких вариантов, находиться внутри оператора def
функции, чтобы загружать только по вызову, использоваться в блоках try
для обеспечения стандартных значений. Они не распознаются и не запускаются до тех пор, пока Python не встретит их во время выполнения программы.Что из нижеперечисленного верно про pandas.Series?
Anonymous Quiz
18%
Каждому значению соответствует метка-идентификатор
5%
Отсчет идентификаторов начинается со случайного int
39%
Series — двухмерная структура данных (индекс + значения)
38%
Все вышеперечисленное
Что означает точка в строках импорта выше?
Anonymous Quiz
16%
Путь, включая вышестоящие папки
38%
Обращение к определенному объекту модуля
38%
Варианты 1 и 2
8%
Ничего из вышеперечисленного