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

compound_stmts.md

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

1> **Источник:** https://python-all.ru/3.2/reference/compound_stmts.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7. Составные инструкции89Составные инструкции содержат (группы) других инструкций; они влияют на выполнение этих других инструкций или управляют им. В общем случае составные инструкции охватывают несколько строк, хотя в простых вариантах вся составная инструкция может помещаться в одну строку.1011Инструкции [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if), [`while`](https://python-all.ru/3.2/reference/compound_stmts.html#while) и [`for`](https://python-all.ru/3.2/reference/compound_stmts.html#for) реализуют традиционные конструкции управления потоком. [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) задаёт обработчики исключений и/или код очистки для группы инструкций, а инструкция [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with) позволяет выполнять код инициализации и завершения вокруг блока. Определения функций и классов также синтаксически являются составными инструкциями.1213Составные инструкции состоят из одной или нескольких «клауз». Клауза состоит из заголовка и «блока». Заголовки клауз одной составной инструкции находятся на одном уровне отступа. Заголовок каждой клаузы начинается с уникального идентифицирующего ключевого слова и заканчивается двоеточием. Блок – это группа инструкций, управляемых клаузой. Блок может состоять из одной или нескольких простых инструкций, разделённых точкой с запятой, на той же строке, что и заголовок, после двоеточия заголовка, или может быть одной или несколькими инструкциями с отступом на следующих строках. Только последняя форма блока может содержать вложенные составные инструкции; следующее недопустимо, в основном потому что было бы неясно, к какой клаузе [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if) будет относиться следующая клауза [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else):1415```python16if test1: if test2: print(x)17```1819Также обратите внимание, что в данном контексте точка с запятой связывает сильнее, чем двоеточие, так что в следующем примере выполняются либо все вызовы [`print()`](https://python-all.ru/3.2/library/functions.html#print), либо ни один:2021```python22if x < y < z: print(x); print(y); print(z)23```2425Подводя итог:2627```2829compound_stmt ::=  if_stmt30                   | while_stmt31                   | for_stmt32                   | try_stmt33                   | with_stmt34                   | funcdef35                   | classdef36suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT37statement     ::=  stmt_list NEWLINE | compound_stmt38stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]39```4041Обратите внимание, что инструкции всегда заканчиваются `NEWLINE`, за которым может следовать `DEDENT`. Также обратите внимание, что необязательные продолженные секции всегда начинаются с ключевого слова, которое не может начинать инструкцию, поэтому не возникает неоднозначности (проблема «повисающего [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else)» решается в Python требованием отступа для вложенных инструкций [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if)).4243Форматирование грамматических правил в следующих разделах помещает каждое предложение на отдельную строку для ясности.4445## 7.1. Инструкция [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if)4647Инструкция [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if) используется для условного выполнения:4849```5051if_stmt ::=  "if" expression ":" suite52             ( "elif" expression ":" suite )*53             ["else" ":" suite]54```5556Она выбирает ровно один из блоков, вычисляя выражения по одному, пока одно из них не окажется истинным (см. раздел [*Булевы операции*](https://python-all.ru/3.2/reference/expressions.html#booleans) для определения истинности и ложности); затем этот блок выполняется (и никакая другая часть инструкции [`if`](https://python-all.ru/3.2/reference/compound_stmts.html#if) не выполняется и не вычисляется). Если все выражения ложны, выполняется блок секции [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else), если она присутствует.5758## 7.2. Инструкция [`while`](https://python-all.ru/3.2/reference/compound_stmts.html#while)5960Инструкция [`while`](https://python-all.ru/3.2/reference/compound_stmts.html#while) используется для повторного выполнения, пока истинно выражение:6162```6364while_stmt ::=  "while" expression ":" suite65                ["else" ":" suite]66```6768Цикл многократно проверяет выражение и, если оно истинно, выполняет первый блок; если выражение ложно (возможно, при первой проверке), выполняется блок секции [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else), если она присутствует, и цикл завершается.6970Инструкция [`break`](https://python-all.ru/3.2/reference/simple_stmts.html#break), выполненная в первом блоке, завершает цикл без выполнения блока секции [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else). Инструкция [`continue`](https://python-all.ru/3.2/reference/simple_stmts.html#continue), выполненная в первом блоке, пропускает оставшуюся часть блока и возвращается к проверке выражения.7172## 7.3. Инструкция [`for`](https://python-all.ru/3.2/reference/compound_stmts.html#for)7374Инструкция [`for`](https://python-all.ru/3.2/reference/compound_stmts.html#for) используется для перебора элементов последовательности (например, строки, кортежа или списка) или другого итерируемого объекта:7576```7778for_stmt ::=  "for" target_list "in" expression_list ":" suite79              ["else" ":" suite]80```8182Список выражений вычисляется один раз; он должен возвращать итерируемый объект. Для результата `expression_list` создаётся итератор. Затем блок выполняется один раз для каждого элемента, полученного от итератора, в порядке возрастания индексов. Каждый элемент по очереди присваивается целевому списку с использованием стандартных правил присваивания (см. [*Assignment statements*](https://python-all.ru/3.2/reference/simple_stmts.html#assignment)), после чего блок выполняется. Когда элементы заканчиваются (что происходит немедленно, если последовательность пуста или итератор возбуждает исключение [`StopIteration`](https://python-all.ru/3.2/library/exceptions.html#StopIteration)), выполняется блок в клаузе [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else), если она присутствует, и цикл завершается.8384Выполнение инструкции [`break`](https://python-all.ru/3.2/reference/simple_stmts.html#break) в первом блоке завершает цикл без выполнения блока клаузы [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else). Выполнение инструкции [`continue`](https://python-all.ru/3.2/reference/simple_stmts.html#continue) в первом блоке пропускает оставшуюся часть блока и продолжает со следующим элементом, или с клаузой [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else), если следующего элемента не было.8586Блок может присваивать значения переменным в целевом списке; это не влияет на следующий присваиваемый элемент.8788Имена в целевом списке не удаляются после завершения цикла, но если последовательность пуста, цикл вообще ничего не присвоит. Подсказка: встроенная функция [`range()`](https://python-all.ru/3.2/library/functions.html#range) возвращает итератор целых чисел, подходящий для имитации эффекта паскалевского `for i := a to b do`; например, `list(range(3))` возвращает список `[0, 1, 2]`.8990> **Примечание**91>92> Есть одна тонкость, когда последовательность изменяется в цикле (это возможно только для изменяемых последовательностей, например, списков). Внутренний счётчик используется для отслеживания того, какой элемент будет использован следующим, и он увеличивается на каждой итерации. Когда счётчик достигает длины последовательности, цикл завершается. Это означает, что если тело цикла удаляет текущий (или предыдущий) элемент из последовательности, следующий элемент будет пропущен (поскольку он получает индекс текущего элемента, который уже был обработан). Аналогично, если тело цикла вставляет элемент перед текущим, то текущий элемент будет обработан снова на следующей итерации. Это может привести к неприятным ошибкам, которых можно избежать, создав временную копию с помощью среза всей последовательности, например,93>94> ```python95> for x in a[:]:96>     if x < 0: a.remove(x)97> ```9899## 7.4. Инструкция [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try)100101Инструкция [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) задаёт обработчики исключений и/или код очистки для группы инструкций:102103```104105try_stmt  ::=  try1_stmt | try2_stmt106try1_stmt ::=  "try" ":" suite107               ("except" [expression ["as" target]] ":" suite)+108               ["else" ":" suite]109               ["finally" ":" suite]110try2_stmt ::=  "try" ":" suite111               "finally" ":" suite112```113114Секция(и) [`except`](https://python-all.ru/3.2/reference/compound_stmts.html#except) задают один или несколько обработчиков исключений. Если в секции [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) не возникает исключений, ни один обработчик не выполняется. Когда в блоке [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) возникает исключение, начинается поиск обработчика исключения. Этот поиск последовательно проверяет секции except, пока не будет найдена подходящая исключению. Секция except без выражения, если присутствует, должна быть последней; она соответствует любому исключению. Для секции except с выражением это выражение вычисляется, и секция соответствует исключению, если полученный объект «совместим» с исключением. Объект совместим с исключением, если он является классом или базовым классом объекта исключения, или кортежем, содержащим элемент, совместимый с исключением.115116Если ни одно предложение except не соответствует исключению, поиск обработчика исключений продолжается в окружающем коде и в стеке вызовов. [\[1\]](https://python-all.ru/3.2/reference/compound_stmts.html#id5)117118Если вычисление выражения в заголовке секции except вызывает исключение, исходный поиск обработчика отменяется и начинается поиск нового исключения в окружающем коде и в стеке вызовов (это обрабатывается так, как если бы всю инструкцию [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) вызвало исключение).119120Когда найдена подходящая секция except, исключение присваивается цели, указанной после ключевого слова [`as`](https://python-all.ru/3.2/reference/compound_stmts.html#as) в этой секции except, если оно присутствует, и выполняется блок секции except. Все секции except должны иметь исполняемый блок. Когда конец этого блока достигнут, выполнение продолжается обычным образом после всей инструкции try. (Это означает, что если для одного исключения существуют два вложенных обработчика, и исключение возникает в секции try внутреннего обработчика, внешний обработчик не будет обрабатывать это исключение.)121122Когда исключение было присвоено с помощью `as target`, оно очищается в конце секции except. Это эквивалентно123124```python125except E as N:126    foo127```128129было преобразовано в130131```python132except E as N:133    try:134        foo135    finally:136        del N137```138139Это означает, что исключение должно быть присвоено другому имени, чтобы на него можно было ссылаться после предложения except. Исключения очищаются, потому что с прикреплённой к ним трассировкой они образуют циклическую ссылку с кадром стека, удерживая все локальные переменные в этом кадре живыми до следующей сборки мусора.140141Перед выполнением блока клаузы except подробности об исключении сохраняются в модуле [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys) и доступны через [`sys.exc_info()`](https://python-all.ru/3.2/library/sys.html#sys.exc_info). [`sys.exc_info()`](https://python-all.ru/3.2/library/sys.html#sys.exc_info) возвращает кортеж из трёх элементов: класс исключения, экземпляр исключения и объект traceback (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.2/reference/datamodel.html#types)), указывающий на точку в программе, где произошло исключение. Значения [`sys.exc_info()`](https://python-all.ru/3.2/library/sys.html#sys.exc_info) восстанавливаются до предыдущих значений (до вызова) при возврате из функции, обработавшей исключение.142143Необязательная секция [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else) выполняется, если и когда управление доходит до конца секции [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try). [\[2\]](https://python-all.ru/3.2/reference/compound_stmts.html#id6) Исключения в секции [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else) не обрабатываются предшествующими секциями [`except`](https://python-all.ru/3.2/reference/compound_stmts.html#except).144145Если присутствует [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally), она задаёт обработчик «очистки». Выполняется секция [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try), включая любые секции [`except`](https://python-all.ru/3.2/reference/compound_stmts.html#except) и [`else`](https://python-all.ru/3.2/reference/compound_stmts.html#else). Если в любой из секций возникает исключение и оно не обработано, исключение временно сохраняется. Выполняется секция [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally). Если есть сохранённое исключение, оно повторно возбуждается в конце секции [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally). Если секция [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally) возбуждает другое исключение, сохранённое исключение устанавливается как контекст нового исключения. Если секция [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally) выполняет инструкцию [`return`](https://python-all.ru/3.2/reference/simple_stmts.html#return) или [`break`](https://python-all.ru/3.2/reference/simple_stmts.html#break), сохранённое исключение отбрасывается:146147```python148def f():149    try:150        1/0151    finally:152        return 42153154>>> f()15542156```157158Информация об исключении недоступна программе во время выполнения секции [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally).159160Когда инструкция [`return`](https://python-all.ru/3.2/reference/simple_stmts.html#return), [`break`](https://python-all.ru/3.2/reference/simple_stmts.html#break) или [`continue`](https://python-all.ru/3.2/reference/simple_stmts.html#continue) выполняется в блоке [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try) инструкции [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try)...[`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally), секция [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally) также выполняется «на выходе». Инструкция [`continue`](https://python-all.ru/3.2/reference/simple_stmts.html#continue) недопустима в секции [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally). (Причина – проблема в текущей реализации; это ограничение может быть снято в будущем.)161162Дополнительную информацию об исключениях можно найти в разделе [*Исключения*](https://python-all.ru/3.2/reference/executionmodel.html#exceptions), а информацию об использовании инструкции [`raise`](https://python-all.ru/3.2/reference/simple_stmts.html#raise) для генерации исключений – в разделе [*Инструкция raise*](https://python-all.ru/3.2/reference/simple_stmts.html#raise).163164## 7.5. Инструкция [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with)165166Инструкция [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with) используется для оборачивания выполнения блока методами, определёнными контекстным менеджером (см. раздел [*Контекстные менеджеры инструкции with*](https://python-all.ru/3.2/reference/datamodel.html#context-managers)). Это позволяет инкапсулировать типичные шаблоны использования [`try`](https://python-all.ru/3.2/reference/compound_stmts.html#try)...[`except`](https://python-all.ru/3.2/reference/compound_stmts.html#except)...[`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally) для удобного повторного использования.167168```169170with_stmt ::=  "with" with_item ("," with_item)* ":" suite171with_item ::=  expression ["as" target]172```173174Выполнение оператора [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with) с одним «элементом» происходит следующим образом:1751761. Контекстное выражение (выражение, указанное в [`with_item`](https://python-all.ru/3.2/reference/compound_stmts.html#grammar-token-with_item)) вычисляется для получения менеджера контекста.1772. Метод [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__) менеджера контекста загружается для последующего использования.1783. Вызывается метод [`__enter__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__enter__) менеджера контекста.1794. Если в оператор [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with) включена цель, то возвращаемое значение [`__enter__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__enter__) присваивается ей.180181   > **Примечание**182   >183   > Оператор [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with) гарантирует, что если метод [`__enter__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__enter__) завершается без ошибки, то [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__) будет вызван всегда. Таким образом, если во время присваивания списку целей возникает ошибка, она обрабатывается так же, как ошибка внутри блока. См. шаг 6 ниже.1845. Выполняется блок.1856. Вызывается метод [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__) менеджера контекста. Если из-за исключения был завершён блок, то тип, значение и traceback исключения передаются как аргументы в [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__). В противном случае передаются три аргумента [`None`](https://python-all.ru/3.2/library/constants.html#None).186187   Если блок был завершён из-за исключения и возвращаемое значение метода [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__) равно false, исключение возбуждается заново. Если возвращаемое значение равно true, исключение подавляется, и выполнение продолжается с оператора, следующего за оператором [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with).188189   Если блок был завершён по любой причине, кроме исключения, возвращаемое значение [`__exit__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__exit__) игнорируется, и выполнение продолжается в обычной точке, соответствующей типу завершения.190191Если элементов несколько, менеджеры контекста обрабатываются так, как если бы было вложено несколько операторов [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with):192193```python194with A() as a, B() as b:195    suite196```197198эквивалентна199200```python201with A() as a:202    with B() as b:203        suite204```205206Изменено в версии 3.1: Поддержка нескольких контекстных выражений.207208> **См. также**209>210> **[**PEP 0343**](https://python-all.ru/3.2/reference/compound_stmts.html) – оператор «with»**211>212> Спецификация, предыстория и примеры для оператора213>214> [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with)215>216> в Python.217218## 7.6. Определения функций219220Определение функции создаёт объект пользовательской функции (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.2/reference/datamodel.html#types)):221222```223224funcdef        ::=  [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite225decorators     ::=  decorator+226decorator      ::=  "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE227dotted_name    ::=  identifier ("." identifier)*228parameter_list ::=  (defparameter ",")*229                    ( "*" [parameter] ("," defparameter)* ["," "**" parameter]230                    | "**" parameter231                    | defparameter [","] )232parameter      ::=  identifier [":" expression]233defparameter   ::=  parameter ["=" expression]234funcname       ::=  identifier235```236237Определение функции – это исполняемый оператор. Его выполнение связывает имя функции в текущей локальной области видимости с объектом функции (обёрткой над исполняемым кодом функции). Этот объект функции содержит ссылку на текущую глобальную область видимости, которая будет использоваться при вызове функции.238239Определение функции не выполняет тело функции; оно выполняется только при вызове функции. [\[3\]](https://python-all.ru/3.2/reference/compound_stmts.html#id7)240241Определение функции может быть обёрнуто одним или несколькими выражениями [*декоратора*](https://python-all.ru/3.2/glossary.html#term-decorator). Выражения декоратора вычисляются при определении функции в области видимости, содержащей определение функции. Результат должен быть вызываемым объектом, который вызывается с объектом функции в качестве единственного аргумента. Возвращённое значение связывается с именем функции вместо объекта функции. Несколько декораторов применяются вложенным образом. Например, следующий код242243```python244@f1(arg)245@f2246def func(): pass247```248249эквивалентна250251```python252def func(): pass253func = f1(arg)(f2(func))254```255256Когда один или несколько [*параметров*](https://python-all.ru/3.2/glossary.html#term-parameter) имеют вид *параметр* `=` *выражение*, говорят, что функция имеет «значения параметров по умолчанию». Для параметра со значением по умолчанию соответствующий [*аргумент*](https://python-all.ru/3.2/glossary.html#term-argument) может быть опущен при вызове, и в этом случае подставляется значение параметра по умолчанию. Если параметр имеет значение по умолчанию, все последующие параметры до «`*`» также должны иметь значение по умолчанию – это синтаксическое ограничение, которое не отражено в грамматике.257258**Значения параметров по умолчанию вычисляются во время выполнения определения функции.** Это означает, что выражение вычисляется один раз, когда функция определяется, и одно и то же «предварительно вычисленное» значение используется при каждом вызове. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, например списком или словарём: если функция изменяет объект (например, добавляя элемент в список), значение по умолчанию фактически изменяется. Обычно это не то, что предполагалось. Один из способов обойти это – использовать `None` в качестве значения по умолчанию и явно проверять его в теле функции, например:259260```python261def whats_on_the_telly(penguin=None):262    if penguin is None:263        penguin = []264    penguin.append("property of the zoo")265    return penguin266```267268Семантика вызова функций подробно описана в разделе [*Вызовы*](https://python-all.ru/3.2/reference/expressions.html#calls). При вызове функции значения присваиваются всем параметрам, перечисленным в списке параметров, либо из позиционных аргументов, либо из именованных аргументов, либо из значений по умолчанию. Если присутствует форма «`*identifier`», она инициализируется кортежем, принимающим все лишние позиционные параметры, по умолчанию – пустой кортеж. Если присутствует форма «`**identifier`», она инициализируется новым словарём, принимающим все лишние именованные аргументы, по умолчанию – новый пустой словарь. Параметры после «`*`» или «`*identifier`» являются только именованными параметрами и могут передаваться только с помощью именованных аргументов.269270Параметры могут иметь аннотации вида «`: выражение`», следующие за именем параметра. Любой параметр может иметь аннотацию, даже параметры вида `*identifier` или `**identifier`. Функции могут иметь аннотацию возврата вида «`-> выражение`» после списка параметров. Эти аннотации могут быть любым допустимым выражением Python и вычисляются при выполнении определения функции. Аннотации могут вычисляться в порядке, отличном от их расположения в исходном коде. Наличие аннотаций не меняет семантику функции. Значения аннотаций доступны как значения словаря, ключами которого являются имена параметров, в атрибуте `__annotations__` объекта функции.271272Также можно создавать анонимные функции (функции, не привязанные к имени) для немедленного использования в выражениях. Для этого используются лямбда-формы, описанные в разделе [*лямбда-выражения*](https://python-all.ru/3.2/reference/expressions.html#lambda). Обратите внимание, что лямбда-форма – это всего лишь сокращение для упрощённого определения функции; функцию, определённую в инструкции “[`def`](https://python-all.ru/3.2/reference/compound_stmts.html#def)”, можно передавать или присваивать другому имени точно так же, как функцию, определённую лямбда-формой. Форма “[`def`](https://python-all.ru/3.2/reference/compound_stmts.html#def)” на самом деле более мощная, поскольку позволяет выполнение нескольких инструкций и аннотаций.273274**Замечание для программиста:** Функции являются объектами первого класса. Форма “`def`”, выполненная внутри определения функции, определяет локальную функцию, которую можно вернуть или передать. Свободные переменные, используемые во вложенной функции, могут обращаться к локальным переменным функции, содержащей определение def. Подробнее см. в разделе [*Именование и связывание*](https://python-all.ru/3.2/reference/executionmodel.html#naming).275276> **См. также**277>278> **[**PEP 3107**](https://python-all.ru/3.2/reference/compound_stmts.html) – Аннотации функций**279>280> Оригинальная спецификация аннотаций функций.281282## 7.7. Определения классов283284Определение класса создаёт объект класса (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.2/reference/datamodel.html#types)):285286```287288classdef    ::=  [decorators] "class" classname [inheritance] ":" suite289inheritance ::=  "(" [parameter_list] ")"290classname   ::=  identifier291```292293Определение класса является исполняемым оператором. Список наследования обычно задаёт список базовых классов (см. [*Настройка создания классов*](https://python-all.ru/3.2/reference/datamodel.html#metaclasses) для более продвинутого использования), поэтому каждый элемент в списке должен вычисляться в объект класса, допускающий создание подклассов. Классы без списка наследования по умолчанию наследуют от базового класса [`object`](https://python-all.ru/3.2/library/functions.html#object); следовательно,294295```python296class Foo:297    pass298```299300эквивалентна301302```python303class Foo(object):304    pass305```306307Затем тело класса выполняется в новом фрейме выполнения (см. [*Naming and binding*](https://python-all.ru/3.2/reference/executionmodel.html#naming)), используя только что созданное локальное пространство имён и исходное глобальное пространство имён. (Обычно тело содержит в основном определения функций.) Когда выполнение тела класса завершается, его фрейм выполнения отбрасывается, но локальное пространство имён сохраняется. [\[4\]](https://python-all.ru/3.2/reference/compound_stmts.html#id8) Затем создаётся объект класса с использованием списка наследования для базовых классов и сохранённого локального пространства имён для словаря атрибутов. Имя класса привязывается к этому объекту класса в исходном локальном пространстве имён.308309Создание класса можно сильно настраивать с помощью [*метаклассов*](https://python-all.ru/3.2/reference/datamodel.html#metaclasses).310311Классы также могут быть декорированы: так же, как и при декорировании функций,312313```python314@f1(arg)315@f2316class Foo: pass317```318319эквивалентна320321```python322class Foo: pass323Foo = f1(arg)(f2(Foo))324```325326Правила вычисления выражений декораторов те же, что и для декораторов функций. Результатом должен быть объект класса, который затем связывается с именем класса.327328**Примечание программиста:** Переменные, определённые в определении класса, являются атрибутами класса; они разделяются экземплярами. Атрибуты экземпляра можно установить в методе с помощью `self.name = value`. Как атрибуты класса, так и атрибуты экземпляра доступны через запись «`self.name`», и при таком доступе атрибут экземпляра скрывает атрибут класса с тем же именем. Атрибуты класса могут использоваться как значения по умолчанию для атрибутов экземпляра, но использование изменяемых значений может привести к неожиданным результатам. [*Дескрипторы*](https://python-all.ru/3.2/reference/datamodel.html#descriptors) можно использовать для создания переменных экземпляра с различными деталями реализации.329330> **См. также**331>332> [**PEP 3115**](https://python-all.ru/3.2/reference/compound_stmts.html) - Метаклассы в Python 3 [**PEP 3129**](https://python-all.ru/3.2/reference/compound_stmts.html) - Декораторы классов333334Сноски335336| [\[1\]](https://python-all.ru/3.2/reference/compound_stmts.html#id1) | Исключение распространяется по стеку вызовов, если только нет предложения [`finally`](https://python-all.ru/3.2/reference/compound_stmts.html#finally), которое само возбуждает другое исключение. Это новое исключение приводит к потере старого. |337| --- | --- |338339| [\[2\]](https://python-all.ru/3.2/reference/compound_stmts.html#id2) | В настоящее время управление «доходит до конца», за исключением случаев возникновения исключения или выполнения оператора [`return`](https://python-all.ru/3.2/reference/simple_stmts.html#return), [`continue`](https://python-all.ru/3.2/reference/simple_stmts.html#continue) или [`break`](https://python-all.ru/3.2/reference/simple_stmts.html#break). |340| --- | --- |341342| [\[3\]](https://python-all.ru/3.2/reference/compound_stmts.html#id3) | Строковый литерал, находящийся в качестве первого оператора в теле функции, преобразуется в атрибут `__doc__` функции и, следовательно, в [*докстринг*](https://python-all.ru/3.2/glossary.html#term-docstring) функции. |343| --- | --- |344345| [\[4\]](https://python-all.ru/3.2/reference/compound_stmts.html#id4) | Строковый литерал, находящийся в качестве первого оператора в теле класса, преобразуется в элемент `__doc__` пространства имён и, следовательно, в [*докстринг*](https://python-all.ru/3.2/glossary.html#term-docstring) класса. |346| --- | --- |347