4. Модель исполнения

4.1. Структура программы

Программа на Python состоит из блоков кода. Блок — это фрагмент текста программы Python, который выполняется как единое целое. Ниже приведены блоки: модуль, тело функции и определение класса. Каждая команда, вводимая в интерактивном режиме, представляет собой блок. Файл сценария (файл, переданный интерпретатору в качестве стандартного ввода или указанный в качестве аргумента командной строки для интерпретатора) является блоком кода. Команда сценария (команда, указанная в командной строке интерпретатора с параметром -c) является блоком кода. Строковый аргумент, передаваемый встроенным функциям eval() и exec(), является блоком кода.

Блок кода выполняется в фрейме исполнения. Фрейм содержит некоторую административную информацию (используемую для отладки) и определяет, где и как выполнение продолжается после завершения выполнения блока кода.

4.2. Именование и привязка

4.2.1. Привязка имён

Имена относятся к объектам. Имена вводятся операциями привязки имён.

Следующие конструкции связывают имена: формальные параметры с функциями, операторы import, определения классов и функций (они связывают имя класса или функции в определяющем блоке) и цели, которые являются идентификаторами, если они встречаются в назначении, заголовок цикла for или после as в операторе with или предложении except. Оператор import формы from ... import * связывает все имена, определенные в импортированном модуле, за исключением имён, начинающихся с подчеркивания. Эту форму можно использовать только на уровне модуля.

Цель, встречающаяся в операторе del, также считается связанной для этой цели (хотя фактическая семантика состоит в том, чтобы отвязать имя).

Каждое присваивание или оператор импорта происходит внутри блока, определенного определением класса или функции, или на уровне модуля (блок кода верхнего уровня).

Если имя связано в блоке — это локальная переменная этого блока, если не объявлено как nonlocal или global. Если имя привязано на уровне модуля, это глобальная переменная. (Переменные блока кода модуля бывают локальными и глобальными.) Если переменная используется в блоке кода, но не определена в нём, это свободная переменная.

Каждое появление имени в тексте программы относится к связыванию этого имени, установленному следующими правилами разрешения имён.

4.2.2. Разрешение имён

Область видимости определяет видимость имени внутри блока. Если локальная переменная определена в блоке, ее область действия включает этот блок. Если определение происходит в функциональном блоке, область действия распространяется на все блоки, содержащиеся в определяющем, если только содержащийся блок не вводит другую привязку для имени.

Когда имя используется в блоке кода, оно разрешается с использованием ближайшей охватывающей области. Набор всех таких областей видимости, видимых блоку кода, называется средой блока.

Если имя вообще не найдено, вызывается исключение NameError. Если текущая область является областью функции, а имя относится к локальной переменной, которая еще не была привязана к значению в точке, где используется имя, вызывается исключение UnboundLocalError. UnboundLocalError является подклассом NameError.

Если операция привязки имени происходит где-либо в блоке кода, все случаи использования имени внутри блока рассматриваются как ссылки на текущий блок. Это может привести к ошибкам, если имя используется в блоке до его привязки. Это тонкое правило. В Python отсутствуют декларации, и он позволяет выполнять операции привязки имён в любом месте блока кода. Локальные переменные блока кода могут быть определены путём сканирования всего текста блока на предмет операций привязки имени.

Если оператор global встречается внутри блока, все случаи использования имени, указанного в операторе, относятся к привязке этого имени в пространстве имён верхнего уровня. Имена разрешаются в пространстве имён верхнего уровня путём поиска в глобальном пространстве имён, то есть пространстве имён модуля, содержащем блок кода, и пространстве имён встроенных функций, пространстве имён модуля builtins. Сначала ищется глобальное пространство имён. Если имя там не найдено, ищется пространство имён встроенных команд. Оператор global должен предшествовать любому использованию имени.

Оператор global имеет ту же область действия, что и операция привязки имени в том же блоке. Если ближайшая охватывающая область для свободной переменной содержит глобальный оператор, свободная переменная рассматривается как глобальная.

Оператор nonlocal заставляет соответствующие имена ссылаться на ранее связанные переменные в ближайшей охватывающей области функции. SyntaxError вызывается во время компиляции, если данное имя не существует в какой-либо области охватывающей функции.

Пространство имён для модуля создается автоматически при первом импорте модуля. Главный модуль сценария всегда называется __main__.

Блоки определения классов и аргументы для exec() и eval() являются особенными в контексте разрешения имён. Определение класса — это исполняемый оператор, который может использовать и определять имена. Эти ссылки следуют обычным правилам разрешения имён, за исключением того, что несвязанные локальные переменные ищутся в глобальном пространстве имён. Пространство имён определения класса становится словарём атрибутов класса. Объем имён, определенных в блоке класса, ограничен блоком класса; он не распространяется на блоки кода методов — это включает в себя понимания и выражения генератора, поскольку они реализуются с использованием области видимости функции. Это означает, что следующее не удастся:

class A:
    a = 42
    b = list(a + i for i in range(10))

4.2.3. Встроенные и ограниченное исполнение

Детали реализации CPython: Пользователи не должны прикасаться к __builtins__; это строго деталь реализации. Пользователи, желающие переопределить значения в пространстве имён builtins, должны import модуль builtins и соответствующим образом изменить его атрибуты.

Встроенное пространство имён, связанное с выполнением блока кода, на самом деле находится путём поиска имени __builtins__ в его глобальном пространстве имён; это должен быть словарь или модуль (в последнем случае используется словарь модуля). По умолчанию в модуле __main__ __builtins__ — это встроенный модуль builtins; в любом другом модуле __builtins__ является псевдонимом словаря самого модуля builtins.

4.2.4. Взаимодействие с динамическими функциями

Разрешение имён свободных переменных происходит во время выполнения, а не во время компиляции. Это означает, что следующий код напечатает 42:

i = 10
def f():
    print(i)
i = 42
f()

Функции eval() и exec() не имеют доступа к полной среде для разрешения имён. Имена могут быть разрешены в локальном и глобальном пространствах имён вызывающего. Свободные переменные разрешаются не в ближайшем охватывающем пространстве имён, а в глобальном пространстве имён. [1] функции exec() и eval() имеют необязательные аргументы для переопределения глобального и локального пространства имён. Если указано только одно пространство имён, оно используется для обоих.

4.3. Исключения

Интерпретатор Python вызывает исключение, когда обнаруживает ошибку времени выполнения (например, деление на ноль). Программа Python также может явно вызвать исключение с помощью оператора raise. Обработчики исключений задаются с помощью оператора tryexcept. Предложение finally такого оператора может использовано для указания кода очистки, который не обрабатывает исключение, но выполняется независимо от того, произошло ли исключение или нет в предыдущем коде.

Если исключение вообще не обрабатывается, интерпретатор прекращает выполнение программы или возвращается к её интерактивному основному циклу. В любом случае он печатает обратную трассировку стека, за исключением случаев, когда исключение составляет SystemExit.

Примечание

Сообщения об исключениях не являются частью API Python. Их содержимое может меняться от одной версии Python к другой без предупреждения и не должно полагаться на код, который будет работать под несколькими версиями интерпретатора.

Сноски

[1]Это ограничение вызывается из-за того, что выполняемый код этими операциями, недоступен во время компиляции модуля.