The Python Language Reference / Справочник по языку Python: 4. Execution model

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

4. Модель исполнения
4.1. Именование и связывание

Hittih 13.07.10 в 13:14

0

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

Hittih 13.07.10 в 13:48

0

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

Hittih 13.07.10 в 14:10

0

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

Hittih 13.07.10 в 14:16

0

"Область (видимости)" определяет видимость имени внутри блока. Если локальная переменная определена в блоке, то ее область видимости включает этот блок. Если это определение происходит в блоке функции, то ее область видимости распространяется на любые блоки, содержащиеся в данном, если только содержащийся блок не вводит своё назначение данному имени. Область видимости имён, определенных в блоке класса ограничивается этим блоком класса; но она не распространяется на блоки кода методов - включая comprehensions и выражения генераторов, поскольку они реализованы с помощью функций (которые создают свою область видимости). Это означает, что следующее приведёт к ошибке :

Hittih 13.07.10 в 14:47

0

class A:

Hittih 13.07.10 в 14:48

0

a = 42

Hittih 13.07.10 в 14:48

0

b = list(a + i for i in range(10))

Hittih 13.07.10 в 14:48

0

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

Hittih 13.07.10 в 15:08

0

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

Hittih 14.07.10 в 22:03

0

Если имя было назначено в блоке , то оно является локальной переменной этого блока, если не объявлено как не локальное. Если имя назначено на уровне модуля - оно является глобальной переменной. (Переменные в блоке кода модуля являются с разных точек зрения и локальными и глобальными.) Если переменная используется в блоке кода но не определена непосредственно в нём (но определена в окружении), то она является "свободной переменной" .

Hittih 13.07.10 в 15:54

0

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

Hittih 13.07.10 в 18:19

0

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

Hittih 14.07.10 в 22:36

0

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

Hittih 13.07.10 в 19:30

0
+1

Цель назначения для инструкции "del" также считается получившей назначение (хотя в действительности смысл в снятии связи с этого имени) . Не допустимо удалять назначение имени, упоминаемого снаружи данного блока – это приведет к сообщению об ошибке «SyntaxError» на этапе компилирования.

Hittih 13.07.10 в 20:00

0

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

Hittih 14.07.10 в 11:51

0

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

Hittih 14.07.10 в 15:30

0

Если инструкция «global» встречается внутри блока, то все использования данного имени, определённого в данной инструкции, обращаются к тому, что назначено этому имени в области имён верхнего уровня. Значение имени сначала ищется в глобальной области имён – тоесть в области имён соответствующего модуля, содержащего данный блок кода, и, если не найдено, то затем ищется в области имён «builtins» этого модуля. Инструкция «global» должна предшествовать всем упоминаниям данного имени.

Hittih 08.08.10 в 16:19

0

Если инструкция «:keyword:`global`» встречается внутри блока, то все использования данного имени, определённого в данной инструкции, обращаются к тому, что назначено этому имени в области имён верхнего уровня. Значение имени сначала ищется в глобальной области имён – тоесть в области имён соответствующего модуля, содержащего данный блок кода, и, если не найдено, то затем ищется в области имён модуля «:mod:`builtins`» . Инструкция «:keyword:`global`» должна предшествовать всем упоминаниям данного имени в данном блоке.

Hittih 08.09.16 в 18:32

0

Встроенная область имён, ассоциирующаяся с данным исполнением кода блока, в действительности ищется под именем «__builtins__» в его глобальной области имён – и это должен быть словарь или модуль (в последнем случае используется соответствующий словарь этого модуля) . По умолчанию, для модуля «__main__» – «__builtins__» – это встроенный модуль «builtins» , а для любого другого модуля – «__builtins__» – это псевдоним непосредственно словаря встроенного модуля «builtins» . «__builtins__» может быть словарём, определённым пользователем, чтобы создать слабую форму исполнения с ограничениями.

Hittih 08.08.10 в 17:51

0

Деталь реализации "CPython" : пользователи не должны влазить в "__builtins__" - его содержание - это исключительно детали реализации. Пользователи, желающие переопределить значения в этом встроенном пространстве имён должны импортировать модуль "builtins" и модифицировать соответственно его атрибуты.

Hittih 17.07.10 в 04:32

0

Пространство имён для модуля автоматически создаётся, когда модуль в первый раз импортируется. Главный модуль скрипта всегда называется "__main__" .

Hittih 14.07.10 в 20:58

0

Инструкция "global" остаётся в силе в тех же рамках, в каких действует связывание имени, произведённое в том же блоке. Если не связанная в данном блоке переменная ("свободная") упоминается в нём в инструкции "global" , то эта переменная считается глобальной.

Hittih 15.07.10 в 18:35

0

Описание класса является исполнимым (в момент создания объекта класса) и может упоминать и создавать имена. В этом случае к именам применяются обычные правила интерпретации имён. Область имён самого объекта класса становится словарём атрибутов этого класса. Имена определённые в пределах класса не видимы в методах класса.

Hittih 15.07.10 в 19:17

0

4.1.1. Взаимодействие с динамическими свойствами
Есть несколько случаев, в которых инструкции Питона являются недопустимыми при использовании совместно с вложенными блоками, содержащими не связанные там ("свободные") переменные.

Hittih 15.07.10 в 19:29

0

Если переменная упоминается снаружи данного блока, то удалять её имя недопустимо. Это приведет к сообщению об ошибке на этапе компилирования.

Hittih 08.08.10 в 16:48

0

Если в функции используется вариант импорта всего - "import *" , и эта функция содержит блок или содержится в блоке в котором есть свободная переменная, то компилятор выдаёт ошибку "SyntaxError" .

Hittih 16.07.10 в 02:53

0

Функции "exec()" и "eval()" не имеют доступа ко всему окружению для интерпретации имён. Значения имён могут искаться в локальной и в глобальной областях имён относительно места вызова. Свободные переменные не ищутся в области имён одним уровнем выше, за исключением глобальной. (Это ограничение происходит от того, что код, исполняемый этими инструкциями не доступен во время компиляции данного модуля.) Функции "exec()" и "eval()" имеют необязательные аргументы для переопределения глобальной и локальной областей имён. Если задан только один аргумент, то он используется для обеих областей.

Hittih 16.07.10 в 03:32

0
+1

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

Hittih 16.07.10 в 04:01

0

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

Hittih 08.12.11 в 07:31

0

Интерпретатор Питона исполняет исключение, когда обнаруживает ошибку исполнения (например деление на ноль) . Программа на Питоне также может явно вызывать исключение инструкцией "raise" . Обработчики исключений задаются инструкцией "try ... except" . Отдел "finally" этой инструкции может быть использован для задания кода, который исполняется независимо от того, произошло ли исключение в соответствующем блоке "try ... except" ( и который не является функцией, получающей как аргумент идентификатор ошибки, и не является собственно обработчиком ошибки) .

Hittih 16.07.10 в 17:06

0

Питон использует ограничительную модель обработки ошибок: обработчик исключения может проанализировать ситуацию и продолжить исполнение за пределами блока "try ... except" , но не может исправить причину ошибки и всё-таки выполнить сбойную операцию (не считая того, чтобы вызвать весь проблемный фрагмент с самого начала) .

Hittih 16.07.10 в 17:51

0

Если для какой-то ошибки вообще не оказалось обработчика - интерпретатор прекращает выполнение данной программы или переходит к новому циклу - в случае интерактивного общения. В любом случае он выдаёт обратную раскрутку стека ("stack backtrace") , кроме случая исключения "SystemExit" .

Hittih 16.07.10 в 18:06

0

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

Hittih 17.07.10 в 04:00

0

Замечание

Hittih 17.07.10 в 04:00

0

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

Hittih 17.07.10 в 04:11

0

Также, смотрите разделы "Инструкция "try" " и "Инструкция "raise" " .

Hittih 16.07.10 в 19:03

0
Минутку...