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

executionmodel.md

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

1> **Источник:** https://python-all.ru/3.11/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`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-c)) является блоком кода. Модуль, запущенный как скрипт верхнего уровня (как модуль `__main__`) из командной строки с аргументом [`-m`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-m), также является блоком кода. Строковый аргумент, переданный встроенным функциям [`eval()`](https://python-all.ru/3.11/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.11/library/functions.html#exec), является блоком кода.1213Блок кода выполняется в *фрейме выполнения*. Фрейм содержит некоторую служебную информацию (используемую для отладки) и определяет, где и как продолжится выполнение после завершения выполнения блока кода.1415## 4.2. Именование и связывание1617### 4.2.1. Связывание имён1819*Имена* ссылаются на объекты. Имена вводятся операциями связывания имён.2021Следующие конструкции связывают имена:2223- формальные параметры функций,24- определения классов,25- определения функций,26- выражения присваивания,27- [targets](https://python-all.ru/3.11/reference/simple_stmts.html#assignment) that are identifiers if occurring in an assignment:2829  - заголовок цикла [`for`](https://python-all.ru/3.11/reference/compound_stmts.html#for),30  - после `as` в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), в предложении [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except), предложении [`except*`](https://python-all.ru/3.11/reference/compound_stmts.html#except-star) или в as-шаблоне структурного сопоставления с образцом,31  - в шаблоне захвата структурного сопоставления с образцом,32- операторы [`import`](https://python-all.ru/3.11/reference/simple_stmts.html#import).3334Оператор `import` вида `from ... import *` связывает все имена, определённые в импортированном модуле, кроме тех, что начинаются с подчёркивания. Эта форма может использоваться только на уровне модуля.3536Цель, встречающаяся в операторе [`del`](https://python-all.ru/3.11/reference/simple_stmts.html#del), также считается связанной для данной цели (хотя фактическая семантика заключается в отмене связывания имени).3738Каждый оператор присваивания или импорта находится внутри блока, определённого классом или определением функции, либо на уровне модуля (блок кода верхнего уровня).3940Если имя связано в блоке, оно является локальной переменной этого блока, если только не объявлено как [`nonlocal`](https://python-all.ru/3.11/reference/simple_stmts.html#nonlocal) или [`global`](https://python-all.ru/3.11/reference/simple_stmts.html#global). Если имя связано на уровне модуля, оно является глобальной переменной. (Переменные блока кода модуля являются локальными и глобальными.) Если переменная используется в блоке кода, но не определена в нём, она является *свободной переменной*.4142Каждое вхождение имени в тексте программы ссылается на *связывание* этого имени, установленное следующими правилами разрешения имён.4344### 4.2.2. Разрешение имён4546*Область видимости* определяет видимость имени внутри блока. Если локальная переменная определена в блоке, её область видимости включает этот блок. Если определение находится в функциональном блоке, область видимости распространяется на любые блоки, вложенные в определяющий, если вложенный блок не вводит другое связывание для этого имени.4748Когда имя используется в блоке кода, оно разрешается с помощью ближайшей объемлющей области видимости. Множество всех таких областей, видимых блоку кода, называется его *окружением*.4950Когда имя не найдено вовсе, возбуждается исключение [`NameError`](https://python-all.ru/3.11/library/exceptions.html#NameError). Если текущая область видимости – функция, и имя ссылается на локальную переменную, которая ещё не привязана к значению в точке использования, возбуждается исключение [`UnboundLocalError`](https://python-all.ru/3.11/library/exceptions.html#UnboundLocalError). [`UnboundLocalError`](https://python-all.ru/3.11/library/exceptions.html#UnboundLocalError) является подклассом [`NameError`](https://python-all.ru/3.11/library/exceptions.html#NameError).5152Если операция связывания имени встречается в любом месте блока кода, все использования этого имени в блоке считаются ссылками на текущий блок. Это может приводить к ошибкам, когда имя используется в блоке до его связывания. Правило это тонкое. В Python нет объявлений, и операции связывания имени могут встречаться в любом месте блока кода. Локальные переменные блока кода можно определить, просмотрев весь текст блока на предмет операций связывания имён. Примеры см. в [FAQ про UnboundLocalError](https://python-all.ru/3.11/faq/programming.html#faq-unboundlocalerror).5354Если оператор [`global`](https://python-all.ru/3.11/reference/simple_stmts.html#global) встречается внутри блока, все обращения к именам, указанным в этом операторе, относятся к привязкам этих имен в пространстве имен верхнего уровня. Имена разрешаются в пространстве имен верхнего уровня путем поиска в global namespace, т.е. пространстве имен модуля, содержащего блок кода, и во встроенном пространстве имен, являющемся пространством имен модуля [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins). Сначала проверяется глобальное пространство имен. Если имена там не найдены, проверяется встроенное пространство имен. Оператор `global` должен предшествовать всем использованиям перечисленных имен.5556Оператор [`global`](https://python-all.ru/3.11/reference/simple_stmts.html#global) имеет ту же область видимости, что и операция связывания имени в том же блоке. Если ближайшая охватывающая область видимости для свободной переменной содержит оператор global, свободная переменная считается глобальной.5758Оператор [`nonlocal`](https://python-all.ru/3.11/reference/simple_stmts.html#nonlocal) заставляет соответствующие имена ссылаться на ранее связанные переменные в ближайшей объемлющей области видимости функции. [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError) возбуждается во время компиляции, если указанное имя не существует ни в одной объемлющей области видимости функции.5960Пространство имён модуля автоматически создаётся при первом импорте модуля. Главный модуль скрипта всегда называется [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__).6162Блоки определения класса и аргументы [`exec()`](https://python-all.ru/3.11/library/functions.html#exec) и [`eval()`](https://python-all.ru/3.11/library/functions.html#eval) являются особенными с точки зрения разрешения имен. Определение класса – это исполняемый оператор, который может использовать и определять имена. Эти ссылки следуют обычным правилам разрешения имен, за исключением того, что не связанные локальные переменные ищутся в глобальном пространстве имен. Пространство имен определения класса становится словарем атрибутов класса. Область видимости имен, определенных в блоке класса, ограничена блоком класса; она не распространяется на блоки кода методов – это включает выражения-включения (comprehensions) и выражения-генераторы, поскольку они реализованы с использованием области видимости функции. Это означает, что следующий код завершится ошибкой:6364```python65class A:66    a = 4267    b = list(a + i for i in range(10))68```6970### 4.2.3. Встроенные объекты и ограниченное выполнение7172**Деталь реализации CPython:** Пользователям не следует трогать `__builtins__`; это строго деталь реализации. Пользователи, желающие переопределить значения в пространстве имён builtins, должны [`import`](https://python-all.ru/3.11/reference/simple_stmts.html#import) модуль [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins) и соответствующим образом изменить его атрибуты.7374Пространство имён builtins, связанное с выполнением блока кода, на самом деле находится путём поиска имени `__builtins__` в его глобальном пространстве имён; это должен быть словарь или модуль (в последнем случае используется словарь модуля). По умолчанию, в модуле [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__) `__builtins__` является встроенным модулем [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins); во всех остальных модулях `__builtins__` является псевдонимом для словаря самого модуля [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins).7576### 4.2.4. Взаимодействие с динамическими возможностями7778Разрешение имён свободных переменных происходит во время выполнения, а не во время компиляции. Это означает, что следующий код выведет 42:7980```python81i = 1082def f():83    print(i)84i = 4285f()86```8788Функции [`eval()`](https://python-all.ru/3.11/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.11/library/functions.html#exec) не имеют доступа к полному окружению для разрешения имён. Имена могут разрешаться в локальном и глобальном пространствах имён вызывающего кода. Свободные переменные разрешаются не в ближайшем охватывающем пространстве имён, а в глобальном. [\[1\]](https://python-all.ru/3.11/reference/executionmodel.html#id3) Функции [`exec()`](https://python-all.ru/3.11/library/functions.html#exec) и [`eval()`](https://python-all.ru/3.11/library/functions.html#eval) имеют необязательные аргументы для переопределения глобального и локального пространства имён. Если указано только одно пространство имён, оно используется для обоих.8990## 4.3. Исключения9192Исключения – это средство выхода из нормального потока управления блока кода для обработки ошибок или других исключительных ситуаций. Исключение *возбуждается* в том месте, где обнаружена ошибка; оно может быть *обработано* окружающим блоком кода или любым блоком кода, который прямо или косвенно вызвал блок кода, в котором произошла ошибка.9394Интерпретатор Python возбуждает исключение, когда обнаруживает ошибку времени выполнения (например, деление на ноль). Программа на Python также может явно возбудить исключение с помощью оператора [`raise`](https://python-all.ru/3.11/reference/simple_stmts.html#raise). Обработчики исключений задаются с помощью оператора [`try`](https://python-all.ru/3.11/reference/compound_stmts.html#try) … [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except). Предложение [`finally`](https://python-all.ru/3.11/reference/compound_stmts.html#finally) такого оператора можно использовать для указания кода очистки, который не обрабатывает исключение, но выполняется независимо от того, было ли исключение в предшествующем коде.9596В Python используется модель обработки ошибок с «завершением»: обработчик исключений может выяснить, что произошло, и продолжить выполнение на внешнем уровне, но он не может исправить причину ошибки и повторить сбойную операцию (кроме случая повторного входа в проблемный кусок кода с самого начала).9798Если исключение вообще не обрабатывается, интерпретатор завершает выполнение программы или возвращается в свой основной интерактивный цикл. В любом случае выводится трассировка стека, за исключением случая, когда исключение – [`SystemExit`](https://python-all.ru/3.11/library/exceptions.html#SystemExit).99100Исключения идентифицируются экземплярами классов. Предложение [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except) выбирается в зависимости от класса экземпляра: оно должно ссылаться на класс экземпляра или на его [невиртуальный базовый класс](https://python-all.ru/3.11/glossary.html#term-abstract-base-class). Экземпляр может быть получен обработчиком и может нести дополнительную информацию об исключительной ситуации.101102> **Примечание**103>104> Сообщения исключений не являются частью API Python. Их содержимое может меняться от одной версии Python к другой без предупреждения, и на него не следует полагаться в коде, который будет выполняться под несколькими версиями интерпретатора.105106См. также описание оператора [`try`](https://python-all.ru/3.11/reference/compound_stmts.html#try) в разделе [Оператор try](https://python-all.ru/3.11/reference/compound_stmts.html#try) и оператора [`raise`](https://python-all.ru/3.11/reference/simple_stmts.html#raise) в разделе [Оператор raise](https://python-all.ru/3.11/reference/simple_stmts.html#raise).107108Сноски109110\[[1](https://python-all.ru/3.11/reference/executionmodel.html#id1)\]111112Это ограничение возникает потому, что код, который выполняется этими операциями, недоступен на момент компиляции модуля.113