The Python Language Reference / Справочник по языку Python: 4. Execution model
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
4. Модель исполнения Hittih 13.07.10 в 13:14 |
|
|
Имена указывают на обьекты. Имена вводятся операцииями связывания (назначения) имён. Каждое появление имени в тексте программы указывает на то, что назначено этому имени в данном самом внутреннем функциональном блоке. Hittih 13.07.10 в 13:48 |
||
|
Блок - часть текста программы на Питоне, которая выполняется как одно целое. Блоками является следующее : модуль, тело функции и определение класса. Каждая команда, набранная интерактивно, является блоком. Файл скрипта (файл, заданный как стандартный ввод интерпретатора или указанный в первом аргументе командной строки интерпретатора) является блоком кода. Команда скрипта (команда указанная с опцией "-с" в командной строке интерпретатора) является блоком кода. Текстовый аргумент переданный встроенным функциям "eval()" и "exec()" является блоком кода. Hittih 13.07.10 в 14:10 |
||
|
Блок кода выполняется в кадре исполнения. Кадр содержит административную информацию (использующуюся для отладки), и определяет, где и как продолжается выполнение после завершения выполнения блока кода. Hittih 13.07.10 в 14:16 |
||
|
"Область (видимости)" определяет видимость имени внутри блока. Если локальная переменная определена в блоке, то ее область видимости включает этот блок. Если это определение происходит в блоке функции, то ее область видимости распространяется на любые блоки, содержащиеся в данном, если только содержащийся блок не вводит своё назначение данному имени. Область видимости имён, определенных в блоке класса ограничивается этим блоком класса; но она не распространяется на блоки кода методов - включая comprehensions и выражения генераторов, поскольку они реализованы с помощью функций (которые создают свою область видимости). Это означает, что следующее приведёт к ошибке : Hittih 13.07.10 в 14:47 |
||
|
class A: Hittih 13.07.10 в 14:48 |
||
|
a = 42 Hittih 13.07.10 в 14:48 |
||
|
b = list(a + i for i in range(10)) Hittih 13.07.10 в 14:48 |
||
|
Если имя используется в блоке кода, то его значение определяется в рамках ближайшей объемлющей области видимости. Множество всех таких областей видимости, видимых блоку кода - называется окружением данного блока. Hittih 13.07.10 в 15:08 Если имя упоминается в блоке кода, то его значение ищется последовательно переходя от одной области видимости к следующей непосредственно объемлющей до первой содержащей определение данного имени. Множество всех таких областей видимости, используемых блоком кода - называется окружением данного блока. Hittih 14.07.10 в 22:03 |
||
|
Если имя было назначено в блоке , то оно является локальной переменной этого блока, если не объявлено как не локальное. Если имя назначено на уровне модуля - оно является глобальной переменной. (Переменные в блоке кода модуля являются с разных точек зрения и локальными и глобальными.) Если переменная используется в блоке кода но не определена непосредственно в нём (но определена в окружении), то она является "свободной переменной" . Hittih 13.07.10 в 15:54 |
||
|
Когда имя вообще не найдено - вызывается исключение "NameError" . Если это имя указывает на локальную переменную, которая ещё не была связана - вызывается исключение "UnboundLocalError" , которое является подклассом для "NameError" . Hittih 13.07.10 в 18:19 Когда имя вообще не найдено - вызывается исключение "NameError" . Если данное имя указывает на локальную переменную, которая будет связана после этого места, где она упоминаетсся - вызывается исключение "UnboundLocalError" , которое является подклассом для "NameError" . Hittih 14.07.10 в 22:36 |
||
|
Следующие конструкции назначают имена: формальные параметры функции, инструкция "import" , определения класса и функции (они назначают имя класса или функции внутри определяющего блока) , и цели назначения, которые являются идентификаторами, когда встречаются в операциях назначения, заголовок цикла "for" или после "as" в инструкции "with" или выражение "keyword.'except' " . Инструкция импорта в форме "from ... import *" связывает все имена определённые в импортируемом модуле, за исключением начинающихся со знака подчёркивания. Эта форма может быть использована только на уровне модуля. Hittih 13.07.10 в 19:30 |
+1 | |
|
Цель назначения для инструкции "del" также считается получившей назначение (хотя в действительности смысл в снятии связи с этого имени) . Не допустимо удалять назначение имени, упоминаемого снаружи данного блока – это приведет к сообщению об ошибке «SyntaxError» на этапе компилирования. Hittih 13.07.10 в 20:00 |
||
|
Любое назначение или импорт действует только в пределах блока класса, функции или модуля (он является самым высокоуровневым блоком кода) . Hittih 14.07.10 в 11:51 |
||
|
Если операция связывания имени встречается где-либо внутри блока кода, то все упоминания этого имени внутри этого блока воспринимаются как обращения к текущему блоку. Это может приводить к ошибкам, когда в блоке имя используется до его обьявления. Это тонкое правило. Питон не страдает избытком деклараций и позволяет делать назначения именам в любом месте блока кода. Локальные для блока кода переменные определяются путём сканирования операций связывания имён по всему тексту блока. Hittih 14.07.10 в 15:30 |
||
|
Если инструкция «global» встречается внутри блока, то все использования данного имени, определённого в данной инструкции, обращаются к тому, что назначено этому имени в области имён верхнего уровня. Значение имени сначала ищется в глобальной области имён – тоесть в области имён соответствующего модуля, содержащего данный блок кода, и, если не найдено, то затем ищется в области имён «builtins» этого модуля. Инструкция «global» должна предшествовать всем упоминаниям данного имени. Hittih 08.08.10 в 16:19 Если инструкция «:keyword:`global`» встречается внутри блока, то все использования данного имени, определённого в данной инструкции, обращаются к тому, что назначено этому имени в области имён верхнего уровня. Значение имени сначала ищется в глобальной области имён – тоесть в области имён соответствующего модуля, содержащего данный блок кода, и, если не найдено, то затем ищется в области имён модуля «:mod:`builtins`» . Инструкция «:keyword:`global`» должна предшествовать всем упоминаниям данного имени в данном блоке. Hittih 08.09.16 в 18:32 |
||
|
Встроенная область имён, ассоциирующаяся с данным исполнением кода блока, в действительности ищется под именем «__builtins__» в его глобальной области имён – и это должен быть словарь или модуль (в последнем случае используется соответствующий словарь этого модуля) . По умолчанию, для модуля «__main__» – «__builtins__» – это встроенный модуль «builtins» , а для любого другого модуля – «__builtins__» – это псевдоним непосредственно словаря встроенного модуля «builtins» . «__builtins__» может быть словарём, определённым пользователем, чтобы создать слабую форму исполнения с ограничениями. Hittih 08.08.10 в 17:51 |
||
|
Деталь реализации "CPython" : пользователи не должны влазить в "__builtins__" - его содержание - это исключительно детали реализации. Пользователи, желающие переопределить значения в этом встроенном пространстве имён должны импортировать модуль "builtins" и модифицировать соответственно его атрибуты. Hittih 17.07.10 в 04:32 |
||
|
Пространство имён для модуля автоматически создаётся, когда модуль в первый раз импортируется. Главный модуль скрипта всегда называется "__main__" . Hittih 14.07.10 в 20:58 |
||
|
Инструкция "global" остаётся в силе в тех же рамках, в каких действует связывание имени, произведённое в том же блоке. Если не связанная в данном блоке переменная ("свободная") упоминается в нём в инструкции "global" , то эта переменная считается глобальной. Hittih 15.07.10 в 18:35 |
||
|
Описание класса является исполнимым (в момент создания объекта класса) и может упоминать и создавать имена. В этом случае к именам применяются обычные правила интерпретации имён. Область имён самого объекта класса становится словарём атрибутов этого класса. Имена определённые в пределах класса не видимы в методах класса. Hittih 15.07.10 в 19:17 |
||
|
4.1.1. Взаимодействие с динамическими свойствами Hittih 15.07.10 в 19:29 |
||
|
Если переменная упоминается снаружи данного блока, то удалять её имя недопустимо. Это приведет к сообщению об ошибке на этапе компилирования. Hittih 08.08.10 в 16:48 |
||
|
Если в функции используется вариант импорта всего - "import *" , и эта функция содержит блок или содержится в блоке в котором есть свободная переменная, то компилятор выдаёт ошибку "SyntaxError" . Hittih 16.07.10 в 02:53 |
||
|
Функции "exec()" и "eval()" не имеют доступа ко всему окружению для интерпретации имён. Значения имён могут искаться в локальной и в глобальной областях имён относительно места вызова. Свободные переменные не ищутся в области имён одним уровнем выше, за исключением глобальной. (Это ограничение происходит от того, что код, исполняемый этими инструкциями не доступен во время компиляции данного модуля.) Функции "exec()" и "eval()" имеют необязательные аргументы для переопределения глобальной и локальной областей имён. Если задан только один аргумент, то он используется для обеих областей. Hittih 16.07.10 в 03:32 |
+1 | |
|
Исключения являются средством прерывания нормального хода исполнения кода для обработки ошибок или других исключительных ситуаций. Исключение возникает в месте, где обнаружена ошибка; она может быть обработана в текущем блоке кода или в любом блоке кода, который прямо или косвенно вызвал тот блок кода, в котором произошла ошибка. Hittih 16.07.10 в 04:01 Исключения являются средством прерывания нормального хода исполнения кода для обработки ошибок или других исключительных ситуаций. Исключение возникает в месте, где обнаружена ошибка; оно может быть обработано в текущем блоке кода или в любом блоке кода, в котором прямо или косвенно вызван тот блок кода, который вызвал ошибку. Hittih 08.12.11 в 07:31 |
||
|
Интерпретатор Питона исполняет исключение, когда обнаруживает ошибку исполнения (например деление на ноль) . Программа на Питоне также может явно вызывать исключение инструкцией "raise" . Обработчики исключений задаются инструкцией "try ... except" . Отдел "finally" этой инструкции может быть использован для задания кода, который исполняется независимо от того, произошло ли исключение в соответствующем блоке "try ... except" ( и который не является функцией, получающей как аргумент идентификатор ошибки, и не является собственно обработчиком ошибки) . Hittih 16.07.10 в 17:06 |
||
|
Питон использует ограничительную модель обработки ошибок: обработчик исключения может проанализировать ситуацию и продолжить исполнение за пределами блока "try ... except" , но не может исправить причину ошибки и всё-таки выполнить сбойную операцию (не считая того, чтобы вызвать весь проблемный фрагмент с самого начала) . Hittih 16.07.10 в 17:51 |
||
|
Если для какой-то ошибки вообще не оказалось обработчика - интерпретатор прекращает выполнение данной программы или переходит к новому циклу - в случае интерактивного общения. В любом случае он выдаёт обратную раскрутку стека ("stack backtrace") , кроме случая исключения "SystemExit" . Hittih 16.07.10 в 18:06 |
||
|
При исключительной ситуации для её обозначения создаётся экземпляр соответствующего класса ошибки. Обработчик вызывается, если в нём указан класс или один из базовых классов произошедшей ошибки. Экземпляр класса ошибки может быть получен обработчиком и может содержать дополнительную информацию о ситуации ошибки. Hittih 17.07.10 в 04:00 |
||
|
Замечание Hittih 17.07.10 в 04:00 |
||
|
Сообщения о исключениях не являются частью API Питона. Их содержание может меняться от одной версии Питона к другой без предупреждения и код, который будет запускаться на разных версиях интерпретатора не должен полагаться на них. Hittih 17.07.10 в 04:11 |
||
|
Также, смотрите разделы "Инструкция "try" " и "Инструкция "raise" " . Hittih 16.07.10 в 19:03 |
