4. Модель Execution

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

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

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

4.2. Именование и биндинги

4.2.1. Биндинг имён

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

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

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

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

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

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

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

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

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

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

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

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

Исключения - средство того, чтобы убегать из нормального потока контроля блока код, чтобы обработать ошибки или другие исключительные условия. Исключение - raised в точке, где ошибка обнаружена; это может быть handled окружением блок код или любым блоком код, который прямо или косвенно призвал блок код, где ошибка произошла.

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

Python использует «терминальную» модель обработки ошибок: обработчик исключений может выяснить, что произошло, и продолжить выполнение на внешнем уровне, но не может исправить причину ошибки и повторить неудачную операцию (за исключением повторного ввода нарушающего часть код сверху).

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

Исключения определяются класс сущности. Пункт except отобран в зависимости от класс случая: это должно сослаться на класс сущность или основной класс этого. сущность может быть получен укладчиком и может нести дополнительную информацию об исключительном условии.

Примечание

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

См. также описание try оператор в разделе Оператор try и raise оператор в разделе Инструкция raise.

Сноски

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