simple_stmts.md
1> **Источник:** https://python-all.ru/3.15/reference/simple_stmts.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7. Простые инструкции89Простая инструкция содержится в одной логической строке. Несколько простых инструкций могут располагаться на одной строке, разделённые точкой с запятой. Синтаксис для простых инструкций:1011```1213simple_stmt: expression_stmt14 | assert_stmt15 | assignment_stmt16 | augmented_assignment_stmt17 | annotated_assignment_stmt18 | pass_stmt19 | del_stmt20 | return_stmt21 | yield_stmt22 | raise_stmt23 | break_stmt24 | continue_stmt25 | import_stmt26 | future_stmt27 | global_stmt28 | nonlocal_stmt29 | type_stmt30```3132## 7.1. Инструкции-выражения3334Инструкции-выражения используются (в основном в интерактивном режиме) для вычисления и вывода значения, или (обычно) для вызова процедуры (функции, не возвращающей осмысленного результата; в Python процедуры возвращают значение `None`). Другие применения инструкций-выражений допустимы и иногда полезны. Синтаксис инструкции-выражения:3536```3738expression_stmt: starred_expression39```4041Инструкция-выражение вычисляет список выражений (который может быть одиночным выражением).4243В интерактивном режиме, если значение не равно `None`, оно преобразуется в строку с помощью встроенной функции [`repr()`](https://python-all.ru/3.15/library/functions.html#repr), и полученная строка выводится в стандартный вывод на отдельной строке (за исключением случая, когда результат равен `None`, чтобы вызовы процедур не приводили к выводу).4445## 7.2. Инструкции присваивания4647Инструкции присваивания используются для (пере)привязки имён к значениям и изменения атрибутов или элементов изменяемых объектов:4849```5051assignment_stmt: (target_list "=")+ (starred_expression | yield_expression)52target_list: target ("," target)* [","]53target: identifier54 | "(" [target_list] ")"55 | "[" [target_list] "]"56 | attributeref57 | subscription58 | "*" target59```6061(См. раздел [Первичные](https://python-all.ru/3.15/reference/expressions.html#primaries) для определения синтаксиса *attributeref* и *subscription*.)6263Инструкция присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделённый запятыми, последний даёт кортеж) и присваивает единственный результирующий объект каждому из списков целей, слева направо.6465Присваивание определяется рекурсивно в зависимости от формы цели (списка). Когда цель является частью изменяемого объекта (ссылка на атрибут или индексация), изменяемый объект в конечном счёте должен выполнить присваивание и решить, допустимо ли оно, и может возбудить исключение, если присваивание неприемлемо. Правила, соблюдаемые различными типами, и возбуждаемые исключения приводятся в определении типов объектов (см. раздел [Стандартная иерархия типов](https://python-all.ru/3.15/reference/datamodel.html#types)).6667Присваивание объекта списку целей, возможно заключённому в круглые или квадратные скобки, рекурсивно определяется следующим образом.6869- Если список целей состоит из одной цели без завершающей запятой, возможно в круглых скобках, объект присваивается этой цели.70- Иначе:7172 - Если список целей содержит одну цель с префиксом в виде звёздочки, называемую «звёздной» целью: объект должен быть итерируемым, содержащим как минимум столько же элементов, сколько целей в списке целей, минус один. Первые элементы итерируемого объекта присваиваются, слева направо, целям перед звёздной целью. Последние элементы итерируемого объекта присваиваются целям после звёздной цели. Затем список оставшихся элементов итерируемого объекта присваивается звёздной цели (список может быть пустым).73 - Иначе: объект должен быть итерируемым с тем же количеством элементов, сколько целей в списке целей, и элементы присваиваются, слева направо, соответствующим целям.7475Присваивание объекта одной цели рекурсивно определяется следующим образом.7677- Если цель является идентификатором (именем):7879 - Если имя не встречается в инструкции [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global) или [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal) в текущем блоке кода: имя привязывается к объекту в текущем локальном пространстве имён.80 - В противном случае: имя привязывается к объекту в глобальном пространстве имён или во внешнем пространстве имён, определяемом [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal), соответственно.8182 Имя перепривязывается, если оно уже было привязано. Это может привести к тому, что счётчик ссылок на объект, ранее привязанный к имени, достигнет нуля, что вызовет освобождение объекта и вызов его деструктора (если он есть).83- Если цель является ссылкой на атрибут: вычисляется первичное выражение в ссылке. Оно должно давать объект с назначаемыми атрибутами; если это не так, возбуждается [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError). Затем этому объекту предлагается присвоить заданный объект указанному атрибуту; если он не может выполнить присваивание, он возбуждает исключение (обычно, но не обязательно [`AttributeError`](https://python-all.ru/3.15/library/exceptions.html#AttributeError)).8485 Примечание: Если объект является экземпляром класса и ссылка на атрибут встречается по обе стороны от оператора присваивания, выражение в правой части, `a.x`, может обращаться как к атрибуту экземпляра, так и (если атрибут экземпляра отсутствует) к атрибуту класса. Цель в левой части `a.x` всегда устанавливается как атрибут экземпляра, создавая его при необходимости. Таким образом, два вхождения `a.x` не обязательно ссылаются на один и тот же атрибут: если выражение в правой части ссылается на атрибут класса, левая часть создаёт новый атрибут экземпляра в качестве цели присваивания:8687 ```python88 class Cls:89 x = 3 # переменная класса90 inst = Cls()91 inst.x = inst.x + 1 # записывает inst.x как 4, оставляя Cls.x равным 392 ```9394 Это описание не обязательно применимо к атрибутам-дескрипторам, таким как свойства, созданные с помощью [`property()`](https://python-all.ru/3.15/library/functions.html#property).95- Если целью является индексация: вычисляется первичное выражение в ссылке. Затем вычисляется выражение индекса. Затем вызывается метод [`__setitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__setitem__) первичного объекта с двумя аргументами: индексом и присваиваемым объектом.9697 Обычно [`__setitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__setitem__) определён для изменяемых последовательностей (таких как списки) и отображений (таких как словари) и ведёт себя следующим образом.9899 Если первичный объект является изменяемой последовательностью (например, списком), индекс должен давать целое число. Если оно отрицательное, к нему прибавляется длина последовательности. Результирующее значение должно быть неотрицательным целым числом, меньшим длины последовательности, и последовательности предлагается присвоить присваиваемый объект её элементу с этим индексом. Если индекс выходит за пределы диапазона, возбуждается [`IndexError`](https://python-all.ru/3.15/library/exceptions.html#IndexError) (присваивание индексированной последовательности не может добавить новые элементы в список).100101 Если первичным выражением является отображение (например, словарь), то индекс должен иметь тип, совместимый с типом ключа отображения, и отображению затем предлагается создать пару ключ/значение, которая связывает индекс с присваиваемым объектом. Это может либо заменить существующую пару ключ/значение с тем же значением ключа, либо вставить новую пару ключ/значение (если ключа с таким значением не существовало).102103 Если целью является срез: первичное выражение должно вычисляться в изменяемый последовательный объект (например, список). Присваиваемый объект должен быть [итерируемым](https://python-all.ru/3.15/glossary.html#term-iterable). Нижняя и верхняя границы среза должны быть целыми числами; если они равны `None` (или отсутствуют), по умолчанию используются ноль и длина последовательности. Если любая из границ отрицательна, к ней прибавляется длина последовательности. Полученные границы обрезаются так, чтобы находиться в диапазоне от нуля до длины последовательности включительно. Наконец, объекту последовательности предлагается заменить срез элементами присваиваемой последовательности. Длина среза может отличаться от длины присваиваемой последовательности, что изменяет длину целевой последовательности, если целевая последовательность это допускает.104105Хотя определение присваивания подразумевает, что пересечения левой и правой частей являются «одновременными» (например, `a, b = b, a` меняет местами две переменные), пересечения *внутри* набора присваиваемых переменных обрабатываются слева направо, что иногда приводит к путанице. Например, следующая программа выводит `[0, 2]`:106107```python108x = [0, 1]109i = 0110i, x[i] = 1, 2 # i обновляется, затем обновляется x[i]111print(x)112```113114> **См. также**115>116> **[**PEP 3132**](https://python-all.ru/3.15/reference/simple_stmts.html) - Расширенная распаковка итерируемых объектов**117>118> Спецификация для возможности `*target`.119120### 7.2.1. Составные операторы присваивания121122Составное присваивание – это объединение в одном операторе бинарной операции и оператора присваивания:123124```125126augmented_assignment_stmt: augtarget augop (expression_list | yield_expression)127augtarget: identifier | attributeref | subscription128augop: "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="129 | ">>=" | "<<=" | "&=" | "^=" | "|="130```131132(См. раздел [Первичные выражения](https://python-all.ru/3.15/reference/expressions.html#primaries) для определений синтаксиса последних трёх символов.)133134Составное присваивание вычисляет цель (которая, в отличие от обычных операторов присваивания, не может быть распаковкой) и список выражений, выполняет бинарную операцию, соответствующую типу присваивания, над двумя операндами и присваивает результат исходной цели. Цель вычисляется только один раз.135136Составной оператор присваивания, такой как `x += 1`, можно переписать как `x = x + 1` для достижения похожего, но не в точности равного эффекта. В составной версии `x` вычисляется только один раз. Кроме того, когда это возможно, сама операция выполняется *на месте*, то есть вместо создания нового объекта и присваивания его цели старый объект изменяется.137138В отличие от обычных присваиваний, составные присваивания вычисляют левую часть *до* вычисления правой части. Например, `a[i] += f(x)` сначала находит `a[i]`, затем вычисляет `f(x)` и выполняет сложение, и, наконец, записывает результат обратно в `a[i]`.139140За исключением присваивания кортежам и нескольким целям в одном операторе, присваивание, выполняемое составными операторами присваивания, обрабатывается так же, как и обычные присваивания. Аналогично, за исключением возможного поведения *на месте*, бинарная операция, выполняемая составным присваиванием, совпадает с обычными бинарными операциями.141142Для целей, являющихся ссылками на атрибуты, действует то же [предостережение относительно атрибутов класса и экземпляра](https://python-all.ru/3.15/reference/simple_stmts.html#attr-target-note), что и для обычных присваиваний.143144### 7.2.2. Аннотированные операторы присваивания145146[Аннотационное](https://python-all.ru/3.15/glossary.html#term-variable-annotation) присваивание – это объединение в одном операторе аннотации переменной или атрибута и необязательного оператора присваивания:147148```149150annotated_assignment_stmt: augtarget ":" expression151 ["=" (starred_expression | yield_expression)]152```153154Отличие от обычных [операторов присваивания](https://python-all.ru/3.15/reference/simple_stmts.html#assignment) состоит в том, что допускается только одна цель.155156Цель присваивания считается «простой», если она состоит из одного имени, не заключённого в скобки. Для простых целей присваивания, если они находятся в области видимости класса или модуля, аннотации собираются в лениво вычисляемой [области видимости аннотаций](https://python-all.ru/3.15/reference/executionmodel.html#annotation-scopes). Аннотации можно вычислить с помощью атрибута [`__annotations__`](https://python-all.ru/3.15/reference/datamodel.html#object.__annotations__) класса или модуля или с помощью средств модуля [`annotationlib`](https://python-all.ru/3.15/library/annotationlib.html#module-annotationlib).157158Если цель присваивания не является простой (атрибут, узел индекса или имя в скобках), аннотация никогда не вычисляется.159160Если имя аннотировано в области видимости функции, то это имя является локальным для этой области. Аннотации никогда не вычисляются и не сохраняются в областях видимости функций.161162Если правая часть присутствует, аннотированное присваивание выполняет фактическое присваивание так, как если бы аннотации не было. Если правая часть отсутствует для цели-выражения, интерпретатор вычисляет цель, за исключением последнего вызова [`__setitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__setitem__) или [`__setattr__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__setattr__).163164> **См. также**165>166> **[**PEP 526**](https://python-all.ru/3.15/reference/simple_stmts.html) - Синтаксис аннотаций переменных**167>168> Предложение, которое добавило синтаксис для аннотирования типов переменных (включая переменные класса и экземпляра) вместо их выражения через комментарии.169>170> **[**PEP 484**](https://python-all.ru/3.15/reference/simple_stmts.html) - Подсказки типов**171>172> Предложение, которое добавило модуль [`typing`](https://python-all.ru/3.15/library/typing.html#module-typing) для предоставления стандартного синтаксиса аннотаций типов, который может использоваться в инструментах статического анализа и IDE.173174Изменено в версии 3.8: Теперь аннотированные присваивания допускают те же выражения в правой части, что и обычные присваивания. Ранее некоторые выражения (например, выражения кортежа без скобок) вызывали синтаксическую ошибку.175176Изменено в версии 3.14: Теперь аннотации лениво вычисляются в отдельной [области видимости аннотаций](https://python-all.ru/3.15/reference/executionmodel.html#annotation-scopes). Если цель присваивания не является простой, аннотации никогда не вычисляются.177178## 7.3. Инструкция `assert`179180Операторы assert – это удобный способ вставить отладочные утверждения в программу:181182```183184assert_stmt: "assert" expression ["," expression]185```186187Простая форма, `assert expression`, эквивалентна188189```python190if __debug__:191 if not expression: raise AssertionError192```193194Расширенная форма, `assert expression1, expression2`, эквивалентна195196```python197if __debug__:198 if not expression1: raise AssertionError(expression2)199```200201Эти эквивалентности предполагают, что [`__debug__`](https://python-all.ru/3.15/library/constants.html#debug__) и [`AssertionError`](https://python-all.ru/3.15/library/exceptions.html#AssertionError) ссылаются на встроенные переменные с такими именами. В текущей реализации встроенная переменная `__debug__` равна `True` в обычных условиях и `False`, когда запрошена оптимизация (параметр командной строки [`-O`](https://python-all.ru/3.15/using/cmdline.html#cmdoption-O)). Текущий генератор кода не генерирует код для оператора [`assert`](https://python-all.ru/3.15/reference/simple_stmts.html#assert), когда оптимизация запрошена на этапе компиляции. Обратите внимание, что нет необходимости включать исходный код выражения, вызвавшего ошибку, в сообщение об ошибке; он будет отображён как часть трассировки стека.202203Присваивания [`__debug__`](https://python-all.ru/3.15/library/constants.html#debug__) запрещены. Значение встроенной переменной определяется при запуске интерпретатора.204205## 7.4. Инструкция `pass`206207```208209pass_stmt: "pass"210```211212[`pass`](https://python-all.ru/3.15/reference/simple_stmts.html#pass) – пустая операция; при её выполнении ничего не происходит. Она полезна в качестве заполнителя, когда синтаксически требуется оператор, но выполнять код не нужно, например:213214```python215def f(arg): pass # функция, которая пока ничего не делает216217class C: pass # класс без методов (пока)218```219220## 7.5. Инструкция `del`221222```223224del_stmt: "del" target_list225```226227Удаление рекурсивно определяется очень похоже на то, как определяется присваивание. Вместо подробного изложения приведём несколько подсказок.228229Удаление списка целей рекурсивно удаляет каждую цель слева направо.230231Удаление имени удаляет привязку этого имени из локального или глобального пространства имён в зависимости от того, встречается ли имя в операторе [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global) в том же блоке кода. Попытка удалить несвязанное имя вызывает исключение [`NameError`](https://python-all.ru/3.15/library/exceptions.html#NameError).232233Удаление ссылок на атрибуты и индексации передаётся основному объекту; удаление среза в общем случае эквивалентно присваиванию пустого среза соответствующего типа (но даже это определяется объектом среза).234235Изменено в версии 3.2: Ранее было недопустимо удалять имя из локального пространства имён, если оно является свободной переменной во вложенном блоке.236237## 7.6. Инструкция `return`238239```240241return_stmt: "return" [expression_list]242```243244[`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return) может синтаксически встречаться только внутри определения функции, а не внутри определения вложенного класса.245246Если указан список выражений, он вычисляется, иначе подставляется `None`.247248[`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return) завершает текущий вызов функции, возвращая список выражений (или `None`).249250Когда [`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return) передаёт управление из оператора [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally), это предложение `finally` выполняется перед фактическим выходом из функции.251252В генераторной функции оператор [`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return) указывает, что генератор завершён, и вызовет [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration). Возвращаемое значение (если есть) используется как аргумент для создания `StopIteration` и становится атрибутом [`StopIteration.value`](https://python-all.ru/3.15/library/exceptions.html#StopIteration.value).253254В асинхронной генераторной функции пустой оператор [`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return) указывает, что асинхронный генератор завершён, и вызовет [`StopAsyncIteration`](https://python-all.ru/3.15/library/exceptions.html#StopAsyncIteration). Непустой оператор `return` является синтаксической ошибкой в асинхронной генераторной функции.255256## 7.7. Инструкция `yield`257258```259260yield_stmt: yield_expression261```262263Оператор [`yield`](https://python-all.ru/3.15/reference/simple_stmts.html#yield) семантически эквивалентен [выражению yield](https://python-all.ru/3.15/reference/expressions.html#yieldexpr). Оператор `yield` можно использовать, чтобы опустить скобки, которые в противном случае потребовались бы в эквивалентном выражении yield. Например, операторы yield264265```python266yield <expr>267yield from <expr>268```269270эквивалентны выражениям-операторам yield.271272```python273(yield <expr>)274(yield from <expr>)275```276277Выражения и операторы yield используются только при определении [генераторной](https://python-all.ru/3.15/glossary.html#term-generator) функции и используются только в теле функции-генератора. Использование [`yield`](https://python-all.ru/3.15/reference/simple_stmts.html#yield) в определении функции достаточно, чтобы это определение создавало функцию-генератор вместо обычной функции.278279За полными подробностями семантики [`yield`](https://python-all.ru/3.15/reference/simple_stmts.html#yield) обратитесь к разделу [Выражения yield](https://python-all.ru/3.15/reference/expressions.html#yieldexpr).280281## 7.8. Инструкция `raise`282283```284285raise_stmt: "raise" [expression ["from" expression]]286```287288Если выражения отсутствуют, [`raise`](https://python-all.ru/3.15/reference/simple_stmts.html#raise) повторно возбуждает исключение, которое в данный момент обрабатывается, также известное как *активное исключение*. Если активного исключения нет, возбуждается исключение [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError), указывающее на ошибку.289290В противном случае [`raise`](https://python-all.ru/3.15/reference/simple_stmts.html#raise) вычисляет первое выражение как объект исключения. Оно должно быть подклассом или экземпляром [`BaseException`](https://python-all.ru/3.15/library/exceptions.html#BaseException). Если это класс, экземпляр исключения будет получен при необходимости инстанцированием класса без аргументов.291292*Типом* исключения является класс экземпляра исключения, *значением* – сам экземпляр.293294Объект traceback обычно создаётся автоматически при возбуждении исключения и прикрепляется к нему как атрибут [`__traceback__`](https://python-all.ru/3.15/library/exceptions.html#BaseException.__traceback__). Вы можете создать исключение и установить собственный traceback за один шаг, используя метод [`with_traceback()`](https://python-all.ru/3.15/library/exceptions.html#BaseException.with_traceback) (который возвращает тот же экземпляр исключения с traceback, установленным в переданный аргумент), например:295296```python297raise Exception("foo occurred").with_traceback(tracebackobj)298```299300Предложение `from` используется для цепочки исключений: если указано, второе *выражение* должно быть другим классом или экземпляром исключения. Если второе выражение является экземпляром исключения, оно будет прикреплено к возбуждённому исключению как атрибут [`__cause__`](https://python-all.ru/3.15/library/exceptions.html#BaseException.__cause__) (который доступен для записи). Если выражение является классом исключения, класс будет инстанцирован, и полученный экземпляр исключения будет прикреплён к возбуждённому исключению как атрибут `__cause__`. Если возбуждённое исключение не обработано, оба исключения будут выведены:301302```pycon303>>> try:304... print(1 / 0)305... except Exception as exc:306... raise RuntimeError("Something bad happened") from exc307...308Traceback (most recent call last):309 File "<stdin>", line 2, in <module>310 print(1 / 0)311 ~~^~~312ZeroDivisionError: division by zero313314The above exception was the direct cause of the following exception:315316Traceback (most recent call last):317 File "<stdin>", line 4, in <module>318 raise RuntimeError("Something bad happened") from exc319RuntimeError: Something bad happened320```321322Аналогичный механизм работает неявно, если новое исключение возбуждается, когда уже обрабатывается другое исключение. Исключение может быть обработано при использовании предложения [`except`](https://python-all.ru/3.15/reference/compound_stmts.html#except) или [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally), или оператора [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with). Предыдущее исключение затем прикрепляется как атрибут [`__context__`](https://python-all.ru/3.15/library/exceptions.html#BaseException.__context__) нового исключения:323324```pycon325>>> try:326... print(1 / 0)327... except:328... raise RuntimeError("Something bad happened")329...330Traceback (most recent call last):331 File "<stdin>", line 2, in <module>332 print(1 / 0)333 ~~^~~334ZeroDivisionError: division by zero335336During handling of the above exception, another exception occurred:337338Traceback (most recent call last):339 File "<stdin>", line 4, in <module>340 raise RuntimeError("Something bad happened")341RuntimeError: Something bad happened342```343344Цепочку исключений можно явно подавить, указав [`None`](https://python-all.ru/3.15/library/constants.html#None) в предложении `from`:345346```pycon347>>> try:348... print(1 / 0)349... except:350... raise RuntimeError("Something bad happened") from None351...352Traceback (most recent call last):353 File "<stdin>", line 4, in <module>354RuntimeError: Something bad happened355```356357Дополнительную информацию об исключениях можно найти в разделе [Исключения](https://python-all.ru/3.15/reference/executionmodel.html#exceptions), а информацию об обработке исключений – в разделе [Оператор try](https://python-all.ru/3.15/reference/compound_stmts.html#try).358359Изменено в версии 3.3: [`None`](https://python-all.ru/3.15/library/constants.html#None) теперь разрешено как `Y` в `raise X from Y`.360361Добавлен атрибут [`__suppress_context__`](https://python-all.ru/3.15/library/exceptions.html#BaseException.__suppress_context__) для подавления автоматического отображения контекста исключения.362363Изменено в версии 3.11: Если traceback активного исключения изменяется в предложении [`except`](https://python-all.ru/3.15/reference/compound_stmts.html#except), последующий оператор `raise` повторно возбуждает исключение с изменённым traceback. Ранее исключение повторно возбуждалось с traceback, который оно имело при перехвате.364365## 7.9. Инструкция `break`366367```368369break_stmt: "break"370```371372[`break`](https://python-all.ru/3.15/reference/simple_stmts.html#break) может синтаксически находиться только внутри цикла [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.15/reference/compound_stmts.html#while), но не внутри определения функции или класса в этом цикле.373374Он завершает ближайший охватывающий цикл, пропуская необязательное предложение `else`, если оно есть в цикле.375376Если цикл [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for) завершается оператором [`break`](https://python-all.ru/3.15/reference/simple_stmts.html#break), то целевая переменная цикла сохраняет своё текущее значение.377378Когда [`break`](https://python-all.ru/3.15/reference/simple_stmts.html#break) передаёт управление из оператора [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally), это предложение `finally` выполняется перед фактическим выходом из цикла.379380## 7.10. Инструкция `continue`381382```383384continue_stmt: "continue"385```386387[`continue`](https://python-all.ru/3.15/reference/simple_stmts.html#continue) может синтаксически находиться только внутри цикла [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.15/reference/compound_stmts.html#while), но не внутри определения функции или класса в этом цикле. Он переходит к следующей итерации ближайшего охватывающего цикла.388389Когда [`continue`](https://python-all.ru/3.15/reference/simple_stmts.html#continue) передаёт управление из оператора [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally), это предложение `finally` выполняется перед фактическим началом следующей итерации цикла.390391## 7.11. Инструкция `import`392393```394395import_stmt: ["lazy"] "import" module ["as" identifier] ("," module ["as" identifier])*396 | ["lazy"] "from" relative_module "import" identifier ["as" identifier]397 ("," identifier ["as" identifier])*398 | ["lazy"] "from" relative_module "import" "(" identifier ["as" identifier]399 ("," identifier ["as" identifier])* [","] ")"400 | "from" relative_module "import" "*"401module: (identifier ".")* identifier402relative_module: "."* module | "."+403```404405Базовый оператор import (без предложения [`from`](https://python-all.ru/3.15/reference/simple_stmts.html#from)) выполняется в два этапа:4064071. найти модуль, загрузив и проинициализировав его при необходимости4082. определить имя или имена в текущем пространстве имен для области видимости, в которой находится оператор [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import), точно так же, как это сделал бы оператор присваивания (включая семантику [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global) и [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal)).409410Когда оператор содержит несколько частей (разделённых запятыми), два этапа выполняются отдельно для каждой части, точно так, как если бы эти части были разделены на отдельные операторы import.411412Подробности первого этапа, поиска и загрузки модулей, описаны в разделе [система импорта](https://python-all.ru/3.15/reference/import.html#importsystem), который также описывает различные типы пакетов и модулей, которые можно импортировать, а также все перехватчики, которые можно использовать для настройки системы импорта. Обратите внимание, что сбои на этом этапе могут указывать либо на то, что модуль не удалось найти, *или* на то, что произошла ошибка при инициализации модуля, включая выполнение кода модуля.413414Если запрошенный модуль успешно получен, он становится доступным в локальном пространстве имен одним из трёх способов:415416- Если за именем модуля следует `as`, то имя, следующее за `as`, привязывается непосредственно к импортированному модулю.417- Если не указано другое имя и импортируемый модуль является модулем верхнего уровня, имя модуля привязывается в локальном пространстве имен как ссылка на импортированный модуль.418- Если импортируемый модуль *не* является модулем верхнего уровня, то имя пакета верхнего уровня, содержащего этот модуль, привязывается в локальном пространстве имен как ссылка на пакет верхнего уровня. Импортированный модуль должен быть доступен по его полному квалифицированному имени, а не напрямую.419420Форма [`from`](https://python-all.ru/3.15/reference/simple_stmts.html#from) использует немного более сложный процесс:4214221. найти модуль, указанный в предложении [`from`](https://python-all.ru/3.15/reference/simple_stmts.html#from), загрузив и проинициализировав его при необходимости;4232. для каждого из идентификаторов, указанных в предложениях [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import):424425 1. проверить, имеет ли импортированный модуль атрибут с таким именем426 2. если нет, попытаться импортировать подмодуль с таким именем, а затем снова проверить импортированный модуль на наличие этого атрибута427 3. если атрибут не найден, возбуждается [`ImportError`](https://python-all.ru/3.15/library/exceptions.html#ImportError).428 4. в противном случае ссылка на это значение сохраняется в текущем пространстве имен, с использованием имени из предложения `as`, если оно присутствует, иначе с использованием имени атрибута429430Примеры:431432```python433import foo # foo импортирован и привязан локально434import foo.bar.baz # foo, foo.bar и foo.bar.baz импортированы, foo привязан локально435import foo.bar.baz as fbb # foo, foo.bar и foo.bar.baz импортированы, foo.bar.baz привязан как fbb436from foo.bar import baz # foo, foo.bar и foo.bar.baz импортированы, foo.bar.baz привязан как baz437from foo import attr # foo импортирован и foo.attr привязан как attr438```439440Если список идентификаторов заменён звёздочкой (`'*'`), все публичные имена, определённые в модуле, привязываются в локальном пространстве имен для области видимости, в которой находится оператор [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import).441442*Публичные имена*, определённые модулем, определяются путём проверки пространства имен модуля на наличие переменной с именем `__all__`; если она определена, это должна быть последовательность строк, которые являются именами, определёнными или импортированными этим модулем. Имена, содержащие не-ASCII символы, должны быть в [нормализованной форме](https://python-all.ru/3.15/reference/simple_stmts.html) NFKC; подробнее см. [Не-ASCII символы в именах](https://python-all.ru/3.15/reference/lexical_analysis.html#lexical-names-nonascii). Имена, указанные в `__all__`, считаются публичными и должны существовать. Если `__all__` не определён, набор публичных имен включает все имена, найденные в пространстве имен модуля, которые не начинаются с символа подчёркивания (`'_'`). `__all__` должно содержать весь публичный API. Это предназначено для того, чтобы избежать случайного экспорта элементов, не являющихся частью API (таких как библиотечные модули, которые были импортированы и использованы внутри модуля).443444Групповая форма импорта – `from module import *` – разрешена только на уровне модуля. Попытка использовать её в определениях класса или функции приведёт к возбуждению [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError).445446При указании того, какой модуль импортировать, необязательно указывать абсолютное имя модуля. Когда модуль или пакет находится внутри другого пакета, можно выполнить относительный импорт в пределах того же верхнего пакета, не указывая имя пакета. Используя начальные точки в указанном модуле или пакете после [`from`](https://python-all.ru/3.15/reference/simple_stmts.html#from), можно указать, на сколько уровней подняться по иерархии текущего пакета, не указывая точных имён. Одна начальная точка означает текущий пакет, в котором существует модуль, выполняющий импорт. Две точки – на один уровень пакета выше. Три точки – на два уровня выше и т.д. Так, если выполнить `from . import mod` из модуля в пакете `pkg`, то в итоге будет импортирован `pkg.mod`. Если выполнить `from ..subpkg2 import mod` из `pkg.subpkg1`, будет импортирован `pkg.subpkg2.mod`. Спецификация относительных импортов содержится в разделе [Относительные импорты пакетов](https://python-all.ru/3.15/reference/import.html#relativeimports).447448[`importlib.import_module()`](https://python-all.ru/3.15/library/importlib.html#importlib.import_module) предоставлен для поддержки приложений, которые динамически определяют загружаемые модули.449450Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `import` с аргументами `module`, `filename`, `sys.path`, `sys.meta_path`, `sys.path_hooks`.451452### 7.11.1. Ленивые импорты453454Ключевое слово [`lazy`](https://python-all.ru/3.15/reference/simple_stmts.html#lazy) – это [мягкое ключевое слово](https://python-all.ru/3.15/reference/lexical_analysis.html#soft-keywords), которое имеет специальное значение только когда стоит непосредственно перед инструкцией [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import) или [`from`](https://python-all.ru/3.15/reference/simple_stmts.html#from). Когда инструкции import предшествует ключевое слово `lazy`, импорт становится *ленивым*: модуль не загружается сразу в точке инструкции импорта. Вместо этого создаётся ленивый прокси-объект, который связывается с именем. Фактический модуль загружается при первом использовании этого имени.455456Ленивые импорты разрешены только на уровне модуля. Использование [`lazy`](https://python-all.ru/3.15/reference/simple_stmts.html#lazy) внутри функции, тела класса или блока [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try)/[`except`](https://python-all.ru/3.15/reference/compound_stmts.html#except)/[`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally) вызывает [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError). Звёздочные импорты не могут быть ленивыми (`lazy from module import *` – синтаксическая ошибка), а [future-инструкции](https://python-all.ru/3.15/reference/simple_stmts.html#future) не могут быть ленивыми.457458При использовании `lazy from ... import` каждое импортированное имя связывается с ленивым прокси-объектом. Первый доступ к любому из этих имён запускает загрузку всего модуля, но разрешается только конкретное имя до его фактического значения. Остальные имена остаются ленивыми прокси до тех пор, пока к ним не будет доступа.459460Пример:461462```python463lazy import json464import sys465466print('json' in sys.modules) # False – модуль json ещё не загружен467468# Первое использование запускает загрузку469result = json.dumps({"hello": "world"})470471print('json' in sys.modules) # True – теперь загружен472```473474Если во время загрузки модуля возникает ошибка (например, [`ImportError`](https://python-all.ru/3.15/library/exceptions.html#ImportError) или [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError)), она возбуждается в точке первого использования ленивого импорта, а не в самой инструкции импорта.475476Смотрите [**PEP 810**](https://python-all.ru/3.15/reference/simple_stmts.html) для полной спецификации ленивых импортов.477478Добавлено в версии 3.15.479480#### 7.11.1.1. Совместимость через `__lazy_modules__`481482В качестве альтернативы использованию ключевого слова [`lazy`](https://python-all.ru/3.15/reference/simple_stmts.html#lazy) модуль может включить ленивую загрузку для определённых импортов, определив на уровне модуля переменную [`__lazy_modules__`](https://python-all.ru/3.15/reference/datamodel.html#module.__lazy_modules__). Если она присутствует, то должна быть контейнером строк с полностью определёнными именами модулей. Любая обычная (не `lazy`) инструкция [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import) на уровне модуля, цель которой присутствует в `__lazy_modules__`, рассматривается как ленивый импорт, точно так же, как если бы было использовано ключевое слово `lazy`.483484Это предоставляет способ включить ленивую загрузку для определённых зависимостей без изменения отдельных инструкций `import`. Это полезно при поддержке версий Python старше 3.15 и одновременном использовании ленивых импортов в 3.15+:485486```python487__lazy_modules__ = ["json", "pathlib"]488489import json # загружен лениво (имя есть в __lazy_modules__)490import os # загружен немедленно (имя отсутствует в __lazy_modules__)491492import pathlib # загружен лениво493```494495Относительные импорты разрешаются в абсолютные имена перед поиском, поэтому `__lazy_modules__` всегда должен содержать полностью определённые имена модулей.496497Для импортов стиля `from` релевантным именем является модуль, следующий за `from`, а не имена его членов:498499```python500# В mypackage/mymodule.py501__lazy_modules__ = ["mypackage", "mypackage.sub.utils"]502503from . import helper # загружен лениво: . разрешается в mypackage504from .sub.utils import func # загружен лениво: .sub.utils разрешается в mypackage.sub.utils505import json # загружен немедленно (нет в __lazy_modules__)506```507508Импорты внутри функций, тел классов или блоков [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try)/[`except`](https://python-all.ru/3.15/reference/compound_stmts.html#except)/[`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally) всегда являются немедленными, независимо от `__lazy_modules__`.509510Добавлено в версии 3.15.511512### 7.11.2. Future-операторы513514*Future-оператор* – это указание компилятору, что определённый модуль должен быть скомпилирован с использованием синтаксиса или семантики, которые будут доступны в определённом будущем выпуске Python, где эта возможность станет стандартной.515516Инструкция future предназначена для упрощения перехода на будущие версии Python, в которых вносятся несовместимые изменения в язык. Она позволяет использовать новые возможности на уровне отдельных модулей до выхода версии, в которой эта возможность становится стандартной.517518```519520future_stmt: "from" "__future__" "import" feature ["as" identifier]521 ("," feature ["as" identifier])*522 | "from" "__future__" "import" "(" feature ["as" identifier]523 ("," feature ["as" identifier])* [","] ")"524feature: identifier525```526527Инструкция future должна располагаться в начале модуля. До инструкции future могут находиться только:528529- строка документации модуля (если есть),530- комментарии,531- пустые строки и532- другие инструкции future.533534Единственная возможность, для которой требуется инструкция future – `annotations` (см. [**PEP 563**](https://python-all.ru/3.15/reference/simple_stmts.html)).535536Все исторические возможности, включаемые инструкцией future, по-прежнему распознаются в Python 3. Список включает `absolute_import`, `division`, `generators`, `generator_stop`, `unicode_literals`, `print_function`, `nested_scopes` и `with_statement`. Все они избыточны, так как всегда включены, и сохранены только для обратной совместимости.537538Инструкция future распознаётся и обрабатывается особым образом на этапе компиляции: изменения семантики ключевых конструкций часто реализуются путём генерации другого кода. Может даже случиться так, что новая возможность вводит новый несовместимый синтаксис (например, новое зарезервированное слово), и тогда компилятору может потребоваться разбирать модуль иначе. Такие решения нельзя откладывать до выполнения.539540Для любого конкретного выпуска компилятор знает, какие имена возможностей определены, и выдаёт ошибку на этапе компиляции, если инструкция future содержит неизвестную ему возможность.541542Непосредственная семантика времени выполнения такая же, как и для любой инструкции import: существует стандартный модуль [`__future__`](https://python-all.ru/3.15/library/__future__.html#module-__future__), описанный далее, и он будет импортирован обычным образом в момент выполнения инструкции future.543544Интересная семантика времени выполнения зависит от конкретной возможности, включаемой инструкцией future.545546Обратите внимание, что в этой инструкции нет ничего особенного:547548```python549import __future__ [as name]550```551552Это не инструкция future, а обычная инструкция import без особой семантики или синтаксических ограничений.553554Код, компилируемый вызовами встроенных функций [`exec()`](https://python-all.ru/3.15/library/functions.html#exec) и [`compile()`](https://python-all.ru/3.15/library/functions.html#compile), которые встречаются в модуле `M`, содержащем инструкцию future, по умолчанию будет использовать новый синтаксис или семантику, связанные с этой инструкцией future. Это можно контролировать с помощью необязательных аргументов `compile()` – подробнее см. документацию этой функции.555556Инструкция future, введённая в интерактивном приглашении интерпретатора, будет действовать до конца сеанса интерпретатора. Если интерпретатор запущен с опцией [`-i`](https://python-all.ru/3.15/using/cmdline.html#cmdoption-i), ему передано имя выполняемого скрипта, и скрипт содержит инструкцию future, то эта инструкция будет действовать в интерактивном сеансе, который запускается после выполнения скрипта.557558> **См. также**559>560> **[**PEP 236**](https://python-all.ru/3.15/reference/simple_stmts.html) – Назад в \_\_future\_\_**561>562> Оригинальное предложение механизма \_\_future\_\_.563564## 7.12. Инструкция `global`565566```567568global_stmt: "global" identifier ("," identifier)*569```570571Инструкция [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global) заставляет перечисленные идентификаторы интерпретироваться как глобальные. Было бы невозможно присваивать значение глобальной переменной без `global`, хотя свободные переменные могут ссылаться на глобальные без объявления их глобальными.572573Инструкция `global` применяется ко всей текущей области видимости (модуль, тело функции или определение класса). Вызывается [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError), если переменная используется или ей присваивается значение до её объявления как глобальной в этой области.574575На уровне модуля все переменные являются глобальными, поэтому инструкция `global` не имеет эффекта. Однако переменные по-прежнему не должны использоваться или получать значение до их объявления с помощью `global`. Это требование смягчается в интерактивном приглашении ([REPL](https://python-all.ru/3.15/glossary.html#term-REPL)).576577**Замечание для программистов:** [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global) – это директива для парсера. Она применяется только к коду, который разбирается одновременно с инструкцией `global`. В частности, инструкция `global`, содержащаяся в строке или объекте кода, переданном встроенной функции [`exec()`](https://python-all.ru/3.15/library/functions.html#exec), не влияет на блок кода *, содержащий* вызов функции, а код, содержащийся в такой строке, не подвержен влиянию инструкций `global` в коде, содержащем вызов функции. То же самое относится к функциям [`eval()`](https://python-all.ru/3.15/library/functions.html#eval) и [`compile()`](https://python-all.ru/3.15/library/functions.html#compile).578579## 7.13. Инструкция `nonlocal`580581```582583nonlocal_stmt: "nonlocal" identifier ("," identifier)*584```585586Если определение функции или класса вложено (находится внутри) в определения других функций, его нелокальные области видимости – это локальные области видимости окружающих функций. Инструкция [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal) заставляет перечисленные идентификаторы ссылаться на имена, ранее связанные в нелокальных областях видимости. Она позволяет вложенному коду переназначать такие нелокальные идентификаторы. Если имя связано в нескольких нелокальных областях, используется ближайшее связывание. Если имя не связано ни в одной нелокальной области, или если нелокальной области нет, вызывается [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError).587588Инструкция [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal) применяется ко всей области видимости функции или тела класса. Вызывается [`SyntaxError`](https://python-all.ru/3.15/library/exceptions.html#SyntaxError), если переменная используется или ей присваивается значение до её объявления как нелокальной в этой области.589590> **См. также**591>592> **[**PEP 3104**](https://python-all.ru/3.15/reference/simple_stmts.html) – доступ к именам во внешних областях видимости**593>594> Спецификация инструкции [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal).595596**Замечание для программистов:** [`nonlocal`](https://python-all.ru/3.15/reference/simple_stmts.html#nonlocal) – это директива для парсера и применяется только к коду, который разбирается вместе с ней. См. примечание для инструкции [`global`](https://python-all.ru/3.15/reference/simple_stmts.html#global).597598## 7.14. Инструкция `type`599600```601602type_stmt: 'type' identifier [type_params] "=" expression603```604605Инструкция `type` объявляет псевдоним типа, который является экземпляром [`typing.TypeAliasType`](https://python-all.ru/3.15/library/typing.html#typing.TypeAliasType).606607Например, следующая инструкция создаёт псевдоним типа:608609```python610type Point = tuple[float, float]611```612613Этот код примерно эквивалентен:614615```python616annotation-def VALUE_OF_Point():617 return tuple[float, float]618Point = typing.TypeAliasType("Point", VALUE_OF_Point())619```620621`annotation-def` указывает на [аннотационную область](https://python-all.ru/3.15/reference/executionmodel.html#annotation-scopes), которая ведёт себя почти как функция, но с несколькими небольшими отличиями.622623Значение псевдонима типа вычисляется в области видимости аннотации. Оно не вычисляется при создании псевдонима типа, а только при обращении к значению через атрибут `__value__` псевдонима типа (см. [Ленивое вычисление](https://python-all.ru/3.15/reference/executionmodel.html#lazy-evaluation)). Это позволяет псевдониму типа ссылаться на имена, которые еще не определены.624625Псевдонимы типов могут быть обобщёнными, если после имени добавить [список параметров типа](https://python-all.ru/3.15/reference/compound_stmts.html#type-params). Подробнее см. [Обобщённые псевдонимы типов](https://python-all.ru/3.15/reference/compound_stmts.html#generic-type-aliases).626627`type` – это [мягкое ключевое слово](https://python-all.ru/3.15/reference/lexical_analysis.html#soft-keywords).628629Добавлено в версии 3.12.630631> **См. также**632>633> **[**PEP 695**](https://python-all.ru/3.15/reference/simple_stmts.html) – Синтаксис параметров типа**634>635> Введены оператор `type` и синтаксис для обобщённых классов и функций.636