Модель выполнения
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 имеет ту же область видимости, что и операция привязки имени в том же блоке. Если ближайшая вложенная область видимости для свободной переменной содержит оператор global, свободная переменная обрабатывается как глобальная.
Оператор nonlocal заставляет соответствующие имена ссылаться на ранее привязанные переменные в ближайшей вложенной области видимости функции. SyntaxError возникает на этапе компиляции, если заданного имени нет ни в одной вложенной области видимости функции.
Пространство имён для модуля автоматически создается при первом импорте модуля. Главный модуль для скрипта всегда называется __main__.
Определения блоков классов и аргументы для функций exec() и eval() являются специальными в контексте разрешения имён. Определение класса — это исполняемый оператор, который может использовать и определять имена. Эти ссылки следуют обычным правилам разрешения имён с исключением, что неопределённые локальные переменные ищутся в глобальном пространстве имён. Пространство имён определения класса становится словарем атрибутов класса. Область видимости имён, определённых в блоке класса, ограничена этим блоком; она не распространяется на блоки кода методов — это включает в себя списки и генераторы, так как они реализуются с использованием области видимости функции. Это означает, что следующее не сработает:
class A:
a = 42
b = list(a + i for i in range(10))
4.2.3. Встроенные функции и ограниченное выполнение
Примечание реализации CPython: Пользователи не должны трогать __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. Обработчики исключений задаются с помощью оператора try … except. Оператор finally в таком операторе может использоваться для задания кода очистки, который не обрабатывает исключение, но выполняется независимо от того, возникло исключение или нет в предшествующем коде.
Python использует модель «прекращения» обработки ошибок: обработчик исключений может узнать, что произошло, и продолжить выполнение на внешнем уровне, но он не может исправить причину ошибки и повторить неудачную операцию (кроме как, повторно запустив проблемный фрагмент кода с самого начала).
Если исключение не обрабатывается вообще, интерпретатор прекращает выполнение программы или возвращается к своему интерактивному главному циклу. В любом случае он выводит трассировку стека, за исключением случая, когда исключение является SystemExit.
Исключения идентифицируются экземплярами классов. Оператор except выбирается в зависимости от класса экземпляра: он должен ссылаться на класс экземпляра или на его базовый класс. Экземпляр может быть получен обработчиком и может содержать дополнительную информацию об исключительном состоянии.
Примечание
Сообщения об ошибках не являются частью API Python. Их содержание может меняться от одной версии Python к другой без предупреждения, и на них не следует полагаться коду, который будет выполняться под несколькими версиями интерпретатора.
См. также описание оператора try в разделе Оператор try и оператора raise в разделе Оператор raise.
Примечания
-
1 -
Это ограничение возникает потому, что код, выполняемый этими операциями, недоступен на момент компиляции модуля.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/reference/executionmodel.html