Содержание страницы
4. Модель выполнения¶Execution model
4.1. Структура программы¶Structure of a program
Программа на Python состоит из блоков кода.
Блок – это фрагмент текста программы на Python, который выполняется как единое целое.
Блоками являются: модуль, тело функции и определение класса.
Каждая команда, введённая в интерактивном режиме, является блоком. Скриптовый файл (файл, передаваемый
на стандартный ввод интерпретатора или указанный в качестве аргумента командной строки
интерпретатора) является блоком кода. Скриптовая команда (команда, заданная в командной строке
интерпретатора с опцией -c) является блоком кода.
Модуль, запущенный как скрипт верхнего уровня (как модуль __main__) из командной
строки с аргументом -m, также является блоком кода. Строковый аргумент,
переданный встроенным функциям eval() и exec(), является блоком кода.
Блок кода выполняется в фрейме выполнения. Фрейм содержит некоторую служебную информацию (используемую для отладки) и определяет, где и как продолжится выполнение после завершения выполнения блока кода.
4.2. Именование и связывание¶Naming and binding
4.2.1. Связывание имён¶Binding of names
Имена ссылаются на объекты. Имена вводятся операциями связывания имён.
Следующие конструкции связывают имена:
формальные параметры функций,
определения классов,
определения функций,
выражения присваивания,
targets that are identifiers if occurring in an assignment:
операторы
import.
Оператор import вида from ... import * связывает все
имена, определённые в импортированном модуле, кроме тех, что начинаются с подчёркивания.
Эта форма может использоваться только на уровне модуля.
Цель, встречающаяся в операторе del, также считается связанной для
данной цели (хотя фактическая семантика заключается в отмене связывания имени).
Каждый оператор присваивания или импорта находится внутри блока, определённого классом или определением функции, либо на уровне модуля (блок кода верхнего уровня).
Если имя связано в блоке, оно является локальной переменной этого блока, если только
не объявлено как nonlocal или global. Если имя связано на
уровне модуля, оно является глобальной переменной. (Переменные блока кода модуля
являются локальными и глобальными.) Если переменная используется в блоке кода, но не
определена в нём, она является свободной переменной.
Каждое вхождение имени в тексте программы ссылается на связывание этого имени, установленное следующими правилами разрешения имён.
4.2.2. Разрешение имён¶Resolution of names
Область видимости определяет видимость имени внутри блока. Если локальная переменная определена в блоке, её область видимости включает этот блок. Если определение находится в функциональном блоке, область видимости распространяется на любые блоки, вложенные в определяющий, если вложенный блок не вводит другое связывание для этого имени.
Когда имя используется в блоке кода, оно разрешается с помощью ближайшей объемлющей области видимости. Множество всех таких областей, видимых блоку кода, называется его окружением.
Когда имя не найдено вовсе, возбуждается исключение NameError. Если текущая область видимости – функция, и имя ссылается на локальную переменную, которая ещё не привязана к значению в точке использования, возбуждается исключение UnboundLocalError. UnboundLocalError является подклассом NameError.
Если операция связывания имени встречается в любом месте блока кода, все использования этого имени в блоке считаются ссылками на текущий блок. Это может приводить к ошибкам, когда имя используется в блоке до его связывания. Правило это тонкое. В Python нет объявлений, и операции связывания имени могут встречаться в любом месте блока кода. Локальные переменные блока кода можно определить, просмотрев весь текст блока на предмет операций связывания имён. Примеры см. в FAQ про UnboundLocalError.
Если оператор global встречается внутри блока, все обращения к именам,
указанным в этом операторе, относятся к привязкам этих имен в пространстве имен
верхнего уровня. Имена разрешаются в пространстве имен верхнего уровня путем поиска в
global namespace, т.е. пространстве имен модуля, содержащего блок кода,
и во встроенном пространстве имен, являющемся пространством имен модуля builtins. Сначала
проверяется глобальное пространство имен. Если имена там не найдены,
проверяется встроенное пространство имен. Оператор global должен предшествовать
всем использованиям перечисленных имен.
Оператор global имеет ту же область видимости, что и операция связывания имени в том же блоке. Если ближайшая охватывающая область видимости для свободной переменной содержит оператор global, свободная переменная считается глобальной.
Оператор nonlocal заставляет соответствующие имена ссылаться
на ранее связанные переменные в ближайшей объемлющей области видимости функции.
SyntaxError возбуждается во время компиляции, если указанное имя не
существует ни в одной объемлющей области видимости функции.
Пространство имён модуля автоматически создаётся при первом импорте модуля. Главный модуль скрипта всегда называется __main__.
Блоки определения класса и аргументы exec() и eval() являются
особенными с точки зрения разрешения имен.
Определение класса – это исполняемый оператор, который может использовать и определять имена.
Эти ссылки следуют обычным правилам разрешения имен, за исключением
того, что не связанные локальные переменные ищутся в глобальном пространстве имен.
Пространство имен определения класса становится словарем атрибутов
класса. Область видимости имен, определенных в блоке класса, ограничена
блоком класса; она не распространяется на блоки кода методов – это включает
выражения-включения (comprehensions) и выражения-генераторы, поскольку они реализованы с использованием
области видимости функции. Это означает, что следующий код завершится ошибкой:
class A:
a = 42
b = list(a + i for i in range(10))
4.2.3. Встроенные объекты и ограниченное выполнение¶Builtins and restricted execution
Деталь реализации CPython: Пользователям не следует трогать __builtins__; это строго деталь реализации.
Пользователи, желающие переопределить значения в пространстве имён builtins, должны
import модуль builtins и соответствующим образом изменить его атрибуты.
Пространство имён builtins, связанное с выполнением блока кода,
на самом деле находится путём поиска имени __builtins__ в его
глобальном пространстве имён; это должен быть словарь или модуль (в
последнем случае используется словарь модуля). По умолчанию, в
модуле __main__ __builtins__ является встроенным модулем
builtins; во всех остальных модулях __builtins__ является
псевдонимом для словаря самого модуля builtins.
4.2.4. Взаимодействие с динамическими возможностями¶Interaction with dynamic features
Разрешение имён свободных переменных происходит во время выполнения, а не во время компиляции. Это означает, что следующий код выведет 42:
i = 10
def f():
print(i)
i = 42
f()
Функции eval() и exec() не имеют доступа к полному
окружению для разрешения имён. Имена могут разрешаться в локальном и глобальном
пространствах имён вызывающего кода. Свободные переменные разрешаются не в ближайшем
охватывающем пространстве имён, а в глобальном. [1] Функции exec() и
eval() имеют необязательные аргументы для переопределения глобального и локального
пространства имён. Если указано только одно пространство имён, оно используется для обоих.
4.3. Исключения¶Exceptions
Исключения – это средство выхода из нормального потока управления блока кода для обработки ошибок или других исключительных ситуаций. Исключение возбуждается в том месте, где обнаружена ошибка; оно может быть обработано окружающим блоком кода или любым блоком кода, который прямо или косвенно вызвал блок кода, в котором произошла ошибка.
Интерпретатор Python возбуждает исключение, когда обнаруживает ошибку времени выполнения
(например, деление на ноль). Программа на Python также может явно возбудить
исключение с помощью оператора raise. Обработчики исключений задаются
с помощью оператора try … except. Предложение finally
такого оператора можно использовать для указания кода очистки, который не
обрабатывает исключение, но выполняется независимо от того, было ли исключение в
предшествующем коде.
В Python используется модель обработки ошибок с «завершением»: обработчик исключений может выяснить, что произошло, и продолжить выполнение на внешнем уровне, но он не может исправить причину ошибки и повторить сбойную операцию (кроме случая повторного входа в проблемный кусок кода с самого начала).
Если исключение вообще не обрабатывается, интерпретатор завершает выполнение
программы или возвращается в свой основной интерактивный цикл. В любом случае выводится
трассировка стека, за исключением случая, когда исключение – SystemExit.
Исключения идентифицируются экземплярами классов. Предложение except
выбирается в зависимости от класса экземпляра: оно должно ссылаться на класс
экземпляра или на его невиртуальный базовый класс.
Экземпляр может быть получен обработчиком и может нести дополнительную информацию
об исключительной ситуации.
Примечание
Сообщения исключений не являются частью API Python. Их содержимое может меняться от одной версии Python к другой без предупреждения, и на него не следует полагаться в коде, который будет выполняться под несколькими версиями интерпретатора.
См. также описание оператора try в разделе Оператор try
и оператора raise в разделе Оператор raise.
Сноски
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.