Готовый перевод The Python Language Reference / Справочник по языку Python: 4. Execution model
4. Модель исполнения
4.1. Именование и связывание
Имена указывают на обьекты. Имена вводятся операцииями связывания (назначения) имён. Каждое появление имени в тексте программы указывает на то, что назначено этому имени в данном самом внутреннем функциональном блоке.
Блок - часть текста программы на Питоне, которая выполняется как одно целое. Блоками является следующее : модуль, тело функции и определение класса. Каждая команда, набранная интерактивно, является блоком. Файл скрипта (файл, заданный как стандартный ввод интерпретатора или указанный в первом аргументе командной строки интерпретатора) является блоком кода. Команда скрипта (команда указанная с опцией "-с" в командной строке интерпретатора) является блоком кода. Текстовый аргумент переданный встроенным функциям "eval()" и "exec()" является блоком кода.
Блок кода выполняется в кадре исполнения. Кадр содержит административную информацию (использующуюся для отладки), и определяет, где и как продолжается выполнение после завершения выполнения блока кода.
"Область (видимости)" определяет видимость имени внутри блока. Если локальная переменная определена в блоке, то ее область видимости включает этот блок. Если это определение происходит в блоке функции, то ее область видимости распространяется на любые блоки, содержащиеся в данном, если только содержащийся блок не вводит своё назначение данному имени. Область видимости имён, определенных в блоке класса ограничивается этим блоком класса; но она не распространяется на блоки кода методов - включая comprehensions и выражения генераторов, поскольку они реализованы с помощью функций (которые создают свою область видимости). Это означает, что следующее приведёт к ошибке :
class A:
a = 42
b = list(a + i for i in range(10))
Если имя упоминается в блоке кода, то его значение ищется последовательно переходя от одной области видимости к следующей непосредственно объемлющей до первой содержащей определение данного имени. Множество всех таких областей видимости, используемых блоком кода - называется окружением данного блока.
Если имя было назначено в блоке , то оно является локальной переменной этого блока, если не объявлено как не локальное. Если имя назначено на уровне модуля - оно является глобальной переменной. (Переменные в блоке кода модуля являются с разных точек зрения и локальными и глобальными.) Если переменная используется в блоке кода но не определена непосредственно в нём (но определена в окружении), то она является "свободной переменной" .
Когда имя вообще не найдено - вызывается исключение "NameError" . Если данное имя указывает на локальную переменную, которая будет связана после этого места, где она упоминаетсся - вызывается исключение "UnboundLocalError" , которое является подклассом для "NameError" .
Следующие конструкции назначают имена: формальные параметры функции, инструкция "import" , определения класса и функции (они назначают имя класса или функции внутри определяющего блока) , и цели назначения, которые являются идентификаторами, когда встречаются в операциях назначения, заголовок цикла "for" или после "as" в инструкции "with" или выражение "keyword.'except' " . Инструкция импорта в форме "from ... import *" связывает все имена определённые в импортируемом модуле, за исключением начинающихся со знака подчёркивания. Эта форма может быть использована только на уровне модуля.
Цель назначения для инструкции "del" также считается получившей назначение (хотя в действительности смысл в снятии связи с этого имени) . Не допустимо удалять назначение имени, упоминаемого снаружи данного блока – это приведет к сообщению об ошибке «SyntaxError» на этапе компилирования.
Любое назначение или импорт действует только в пределах блока класса, функции или модуля (он является самым высокоуровневым блоком кода) .
Если операция связывания имени встречается где-либо внутри блока кода, то все упоминания этого имени внутри этого блока воспринимаются как обращения к текущему блоку. Это может приводить к ошибкам, когда в блоке имя используется до его обьявления. Это тонкое правило. Питон не страдает избытком деклараций и позволяет делать назначения именам в любом месте блока кода. Локальные для блока кода переменные определяются путём сканирования операций связывания имён по всему тексту блока.
Если инструкция «:keyword:`global`» встречается внутри блока, то все использования данного имени, определённого в данной инструкции, обращаются к тому, что назначено этому имени в области имён верхнего уровня. Значение имени сначала ищется в глобальной области имён – тоесть в области имён соответствующего модуля, содержащего данный блок кода, и, если не найдено, то затем ищется в области имён модуля «:mod:`builtins`» . Инструкция «:keyword:`global`» должна предшествовать всем упоминаниям данного имени в данном блоке.
Встроенная область имён, ассоциирующаяся с данным исполнением кода блока, в действительности ищется под именем «__builtins__» в его глобальной области имён – и это должен быть словарь или модуль (в последнем случае используется соответствующий словарь этого модуля) . По умолчанию, для модуля «__main__» – «__builtins__» – это встроенный модуль «builtins» , а для любого другого модуля – «__builtins__» – это псевдоним непосредственно словаря встроенного модуля «builtins» . «__builtins__» может быть словарём, определённым пользователем, чтобы создать слабую форму исполнения с ограничениями.
Деталь реализации "CPython" : пользователи не должны влазить в "__builtins__" - его содержание - это исключительно детали реализации. Пользователи, желающие переопределить значения в этом встроенном пространстве имён должны импортировать модуль "builtins" и модифицировать соответственно его атрибуты.
Пространство имён для модуля автоматически создаётся, когда модуль в первый раз импортируется. Главный модуль скрипта всегда называется "__main__" .
Инструкция "global" остаётся в силе в тех же рамках, в каких действует связывание имени, произведённое в том же блоке. Если не связанная в данном блоке переменная ("свободная") упоминается в нём в инструкции "global" , то эта переменная считается глобальной.
Описание класса является исполнимым (в момент создания объекта класса) и может упоминать и создавать имена. В этом случае к именам применяются обычные правила интерпретации имён. Область имён самого объекта класса становится словарём атрибутов этого класса. Имена определённые в пределах класса не видимы в методах класса.
4.1.1. Взаимодействие с динамическими свойствами
Есть несколько случаев, в которых инструкции Питона являются недопустимыми при использовании совместно с вложенными блоками, содержащими не связанные там ("свободные") переменные.
Если переменная упоминается снаружи данного блока, то удалять её имя недопустимо. Это приведет к сообщению об ошибке на этапе компилирования.
Если в функции используется вариант импорта всего - "import *" , и эта функция содержит блок или содержится в блоке в котором есть свободная переменная, то компилятор выдаёт ошибку "SyntaxError" .
Функции "exec()" и "eval()" не имеют доступа ко всему окружению для интерпретации имён. Значения имён могут искаться в локальной и в глобальной областях имён относительно места вызова. Свободные переменные не ищутся в области имён одним уровнем выше, за исключением глобальной. (Это ограничение происходит от того, что код, исполняемый этими инструкциями не доступен во время компиляции данного модуля.) Функции "exec()" и "eval()" имеют необязательные аргументы для переопределения глобальной и локальной областей имён. Если задан только один аргумент, то он используется для обеих областей.
Исключения являются средством прерывания нормального хода исполнения кода для обработки ошибок или других исключительных ситуаций. Исключение возникает в месте, где обнаружена ошибка; оно может быть обработано в текущем блоке кода или в любом блоке кода, в котором прямо или косвенно вызван тот блок кода, который вызвал ошибку.
Интерпретатор Питона исполняет исключение, когда обнаруживает ошибку исполнения (например деление на ноль) . Программа на Питоне также может явно вызывать исключение инструкцией "raise" . Обработчики исключений задаются инструкцией "try ... except" . Отдел "finally" этой инструкции может быть использован для задания кода, который исполняется независимо от того, произошло ли исключение в соответствующем блоке "try ... except" ( и который не является функцией, получающей как аргумент идентификатор ошибки, и не является собственно обработчиком ошибки) .
Питон использует ограничительную модель обработки ошибок: обработчик исключения может проанализировать ситуацию и продолжить исполнение за пределами блока "try ... except" , но не может исправить причину ошибки и всё-таки выполнить сбойную операцию (не считая того, чтобы вызвать весь проблемный фрагмент с самого начала) .
Если для какой-то ошибки вообще не оказалось обработчика - интерпретатор прекращает выполнение данной программы или переходит к новому циклу - в случае интерактивного общения. В любом случае он выдаёт обратную раскрутку стека ("stack backtrace") , кроме случая исключения "SystemExit" .
При исключительной ситуации для её обозначения создаётся экземпляр соответствующего класса ошибки. Обработчик вызывается, если в нём указан класс или один из базовых классов произошедшей ошибки. Экземпляр класса ошибки может быть получен обработчиком и может содержать дополнительную информацию о ситуации ошибки.
Замечание
Сообщения о исключениях не являются частью API Питона. Их содержание может меняться от одной версии Питона к другой без предупреждения и код, который будет запускаться на разных версиях интерпретатора не должен полагаться на них.
Также, смотрите разделы "Инструкция "try" " и "Инструкция "raise" " .
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/5672/17130
Переводчики: Hittih
Настройки
Готово:
