Spec-Zone.ru › Python 3.10

Модель выполнения

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

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

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

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

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

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

Следующие конструкции привязывают имена:

  • формальные параметры функций,
  • определения классов,
  • определения функций,
  • выражения присваивания,
  • цели, которые являются идентификаторами, если встречаются в операторе присваивания:

    • for заголовок цикла,
    • после as в операторе with, блоке except или в шаблоне as при структурном сопоставлении,
    • в шаблоне захвата при структурном сопоставлении
  • import операторы.

Оператор import вида from ... import * привязывает все имена, определённые в импортируемом модуле, за исключением тех, которые начинаются с подчёркивания. Этот вид может быть использован только на уровне модуля.

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

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

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

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

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

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

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

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

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

Если оператор global встречается внутри блока, все использования указанных в операторе имён ссылаются на привязки этих имён в пространстве имён верхнего уровня. Имена разрешаются в пространстве имён верхнего уровня путем поиска в глобальном пространстве имён, т. е. пространстве имён модуля, содержащего блок кода, и в пространстве имён builtins, пространстве имён модуля builtins. Глобальное пространство имён ищется в первую очередь. Если имена там не найдены, ищется пространство имён 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__; это строго деталь реализации. Пользователи, желающие переопределять значения в пространстве имён builtins, должны import модуль builtins и соответствующим образом изменить его атрибуты.

Пространство имён 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/reference/executionmodel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API