Документация Python неофициальный перевод

executionmodel.md

99 строк · 19.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.5/reference/executionmodel.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 4. Модель выполнения89## 4.1. Структура программы1011Программа на Python состоит из блоков кода. *Блок* – это часть текста программы на Python, которая выполняется как единое целое. Блоками являются: модуль, тело функции и определение класса. Каждая команда, введённая в интерактивном режиме, является блоком. Файл сценария (файл, переданный как стандартный ввод интерпретатора или указанный в качестве аргумента командной строки интерпретатора) является блоком кода. Команда сценария (команда, указанная в командной строке интерпретатора с опцией ‘**-c**’) является блоком кода. Строковый аргумент, переданный встроенным функциям [`eval()`](https://python-all.ru/3.5/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.5/library/functions.html#exec), является блоком кода.1213Блок кода выполняется в *фрейме выполнения*. Фрейм содержит некоторую служебную информацию (используемую для отладки) и определяет, где и как продолжится выполнение после завершения выполнения блока кода.1415## 4.2. Именование и связывание1617### 4.2.1. Связывание имён1819*Имена* ссылаются на объекты. Имена вводятся операциями связывания имён.2021Следующие конструкции связывают имена: формальные параметры функций, операторы [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import), определения классов и функций (они связывают имя класса или функции в определяющем блоке), и цели, являющиеся идентификаторами, если они встречаются в присваивании, заголовке цикла [`for`](https://python-all.ru/3.5/reference/compound_stmts.html#for) или после [`as`](https://python-all.ru/3.5/reference/compound_stmts.html#as) в операторе [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with) или предложении [`except`](https://python-all.ru/3.5/reference/compound_stmts.html#except). Оператор [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import) вида `from ... import *` связывает все имена, определённые в импортированном модуле, кроме начинающихся с подчёркивания. Эта форма может использоваться только на уровне модуля.2223Цель, встречающаяся в операторе [`del`](https://python-all.ru/3.5/reference/simple_stmts.html#del), также считается связанной для данной цели (хотя фактическая семантика заключается в отмене связывания имени).2425Каждый оператор присваивания или импорта находится внутри блока, определённого классом или определением функции, либо на уровне модуля (блок кода верхнего уровня).2627Если имя связано в блоке, оно является локальной переменной этого блока, если только не объявлено как [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal) или [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global). Если имя связано на уровне модуля, оно является глобальной переменной. (Переменные блока кода модуля являются локальными и глобальными.) Если переменная используется в блоке кода, но не определена в нём, она является *свободной переменной*.2829Каждое вхождение имени в тексте программы ссылается на *связывание* этого имени, установленное следующими правилами разрешения имён.3031### 4.2.2. Разрешение имён3233*Область видимости* определяет видимость имени внутри блока. Если локальная переменная определена в блоке, её область видимости включает этот блок. Если определение находится в функциональном блоке, область видимости распространяется на любые блоки, вложенные в определяющий, если вложенный блок не вводит другое связывание для этого имени.3435Когда имя используется в блоке кода, оно разрешается с помощью ближайшей объемлющей области видимости. Множество всех таких областей, видимых блоку кода, называется его *окружением*.3637Когда имя не найдено вовсе, возбуждается исключение [`NameError`](https://python-all.ru/3.5/library/exceptions.html#NameError). Если текущая область видимости – функция, и имя ссылается на локальную переменную, которая ещё не привязана к значению в точке использования, возбуждается исключение [`UnboundLocalError`](https://python-all.ru/3.5/library/exceptions.html#UnboundLocalError). [`UnboundLocalError`](https://python-all.ru/3.5/library/exceptions.html#UnboundLocalError) является подклассом [`NameError`](https://python-all.ru/3.5/library/exceptions.html#NameError).3839Если операция связывания имени происходит где-либо внутри блока кода, все использования имени в блоке рассматриваются как ссылки на текущий блок. Это может привести к ошибкам, когда имя используется в блоке до того, как оно связано. Это правило тонкое. В Python нет объявлений, и операции связывания имени могут происходить в любом месте блока кода. Локальные переменные блока кода можно определить, просканировав весь текст блока на наличие операций связывания имени.4041Если оператор [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) встречается внутри блока, все обращения к имени, указанному в этом операторе, ссылаются на связывание этого имени в пространстве имён верхнего уровня. Имена разрешаются в пространстве имён верхнего уровня путём поиска в глобальном пространстве имён, то есть в пространстве имён модуля, содержащего блок кода, и в пространстве имён встроенных имён, пространстве имён модуля [`builtins`](https://python-all.ru/3.5/library/builtins.html#module-builtins). Сначала выполняется поиск в глобальном пространстве имён. Если имя не найдено там, выполняется поиск в пространстве имён встроенных имён. Оператор [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) должен предшествовать всем обращениям к имени.4243Оператор [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) имеет ту же область видимости, что и операция связывания имени в том же блоке. Если ближайшая охватывающая область видимости для свободной переменной содержит оператор global, свободная переменная считается глобальной.4445Оператор [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal) заставляет соответствующие имена ссылаться на ранее связанные переменные в ближайшей объемлющей области видимости функции. [`SyntaxError`](https://python-all.ru/3.5/library/exceptions.html#SyntaxError) возбуждается во время компиляции, если указанное имя не существует ни в одной объемлющей области видимости функции.4647Пространство имён модуля автоматически создаётся при первом импорте модуля. Главный модуль скрипта всегда называется [`__main__`](https://python-all.ru/3.5/library/__main__.html#module-__main__).4849Блоки определения класса и аргументы [`exec()`](https://python-all.ru/3.5/library/functions.html#exec) и [`eval()`](https://python-all.ru/3.5/library/functions.html#eval) являются особенными с точки зрения разрешения имен. Определение класса – это исполняемый оператор, который может использовать и определять имена. Эти ссылки следуют обычным правилам разрешения имен, за исключением того, что не связанные локальные переменные ищутся в глобальном пространстве имен. Пространство имен определения класса становится словарем атрибутов класса. Область видимости имен, определенных в блоке класса, ограничена блоком класса; она не распространяется на блоки кода методов – это включает выражения-включения (comprehensions) и выражения-генераторы, поскольку они реализованы с использованием области видимости функции. Это означает, что следующий код завершится ошибкой:5051```python52class A:53    a = 4254    b = list(a + i for i in range(10))55```5657### 4.2.3. Встроенные объекты и ограниченное выполнение5859Пространство имён встроенных объектов, связанное с выполнением блока кода, фактически находится путём поиска имени `__builtins__` в его глобальном пространстве имён; это должен быть словарь или модуль (в последнем случае используется словарь модуля). По умолчанию, когда в модуле [`__main__`](https://python-all.ru/3.5/library/__main__.html#module-__main__), `__builtins__` является встроенным модулем [`builtins`](https://python-all.ru/3.5/library/builtins.html#module-builtins); когда в любом другом модуле, `__builtins__` является псевдонимом словаря самого модуля [`builtins`](https://python-all.ru/3.5/library/builtins.html#module-builtins). `__builtins__` может быть установлен в пользовательский словарь для создания слабой формы ограниченного выполнения.6061**Деталь реализации CPython:** Пользователям не следует трогать `__builtins__`; это строго деталь реализации. Пользователи, желающие переопределить значения в пространстве имён builtins, должны [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import) модуль [`builtins`](https://python-all.ru/3.5/library/builtins.html#module-builtins) и соответствующим образом изменить его атрибуты.6263### 4.2.4. Взаимодействие с динамическими возможностями6465Разрешение имён свободных переменных происходит во время выполнения, а не во время компиляции. Это означает, что следующий код выведет 42:6667```python68i = 1069def f():70    print(i)71i = 4272f()73```7475Функции [`eval()`](https://python-all.ru/3.5/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.5/library/functions.html#exec) не имеют доступа к полному окружению для разрешения имён. Имена могут разрешаться в локальном и глобальном пространствах имён вызывающего кода. Свободные переменные разрешаются не в ближайшем охватывающем пространстве имён, а в глобальном. [\[1\]](https://python-all.ru/3.5/reference/executionmodel.html#id3) Функции [`exec()`](https://python-all.ru/3.5/library/functions.html#exec) и [`eval()`](https://python-all.ru/3.5/library/functions.html#eval) имеют необязательные аргументы для переопределения глобального и локального пространства имён. Если указано только одно пространство имён, оно используется для обоих.7677## 4.3. Исключения7879Исключения – это способ выйти из нормального потока управления блока кода, чтобы обработать ошибки или другие исключительные ситуации. Исключение *возбуждается* в том месте, где обнаружена ошибка; оно может быть *перехвачено* окружающим блоком кода или любым блоком, который прямо или косвенно вызвал блок кода, где произошла ошибка.8081Интерпретатор Python возбуждает исключение, когда обнаруживает ошибку времени выполнения (например, деление на ноль). Программа на Python также может явно возбудить исключение с помощью оператора [`raise`](https://python-all.ru/3.5/reference/simple_stmts.html#raise). Обработчики исключений задаются с помощью оператора [`try`](https://python-all.ru/3.5/reference/compound_stmts.html#try) … [`except`](https://python-all.ru/3.5/reference/compound_stmts.html#except). Предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally) такого оператора можно использовать для указания кода очистки, который не обрабатывает исключение, но выполняется независимо от того, было ли исключение в предшествующем коде.8283В Python используется модель обработки ошибок с «завершением»: обработчик исключений может выяснить, что произошло, и продолжить выполнение на внешнем уровне, но он не может исправить причину ошибки и повторить сбойную операцию (кроме случая повторного входа в проблемный кусок кода с самого начала).8485Когда исключение никак не обрабатывается, интерпретатор завершает выполнение программы или возвращается в свой интерактивный главный цикл. В любом случае он выводит трассировку стека, за исключением случаев, когда исключение – [`SystemExit`](https://python-all.ru/3.5/library/exceptions.html#SystemExit).8687Исключения идентифицируются экземплярами классов. Предложение [`except`](https://python-all.ru/3.5/reference/compound_stmts.html#except) выбирается в зависимости от класса экземпляра: оно должно ссылаться на класс экземпляра или один из его базовых классов. Экземпляр может быть получен обработчиком и может содержать дополнительную информацию об исключительной ситуации.8889> **Примечание**90>91> Сообщения исключений не являются частью API Python. Их содержимое может меняться от одной версии Python к другой без предупреждения, и на него не следует полагаться в коде, который будет выполняться под несколькими версиями интерпретатора.9293См. также описание оператора [`try`](https://python-all.ru/3.5/reference/compound_stmts.html#try) в разделе [Оператор try](https://python-all.ru/3.5/reference/compound_stmts.html#try) и оператора [`raise`](https://python-all.ru/3.5/reference/simple_stmts.html#raise) в разделе [Оператор raise](https://python-all.ru/3.5/reference/simple_stmts.html#raise).9495Сноски9697| [\[1\]](https://python-all.ru/3.5/reference/executionmodel.html#id1) | Это ограничение возникает потому, что код, который выполняется этими операциями, недоступен на момент компиляции модуля. |98| --- | --- |99