simple_stmts.md
1> **Источник:** https://python-all.ru/3.4/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 | pass_stmt18 | del_stmt19 | return_stmt20 | yield_stmt21 | raise_stmt22 | break_stmt23 | continue_stmt24 | import_stmt25 | global_stmt26 | nonlocal_stmt27```2829## 7.1. Инструкции-выражения3031Инструкции-выражения используются (в основном в интерактивном режиме) для вычисления и вывода значения или (обычно) для вызова процедуры (функции, которая не возвращает значимого результата; в Python процедуры возвращают значение `None`). Другие применения инструкций-выражений допустимы и иногда полезны. Синтаксис инструкции-выражения:3233```3435expression_stmt ::= expression_list36```3738Инструкция-выражение вычисляет список выражений (который может быть одиночным выражением).3940В интерактивном режиме, если значение не равно `None`, оно преобразуется в строку с помощью встроенной функции [`repr()`](https://python-all.ru/3.4/library/functions.html#repr), и полученная строка выводится на стандартный вывод на отдельной строке (за исключением случая, когда результат равен `None`, так что вызовы процедур не вызывают никакого вывода).4142## 7.2. Инструкции присваивания4344Инструкции присваивания используются для (пере)привязки имён к значениям и изменения атрибутов или элементов изменяемых объектов:4546```4748assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)49target_list ::= target ("," target)* [","]50target ::= identifier51 | "(" target_list ")"52 | "[" target_list "]"53 | attributeref54 | subscription55 | slicing56 | "*" target57```5859(См. раздел [*Первичные выражения*](https://python-all.ru/3.4/reference/expressions.html#primaries) с определениями синтаксиса для *attributeref*, *subscription* и *slicing*.)6061Инструкция присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделённый запятыми, последний даёт кортеж) и присваивает единственный результирующий объект каждому из списков целей, слева направо.6263Присваивание определяется рекурсивно в зависимости от формы цели (списка). Если цель является частью изменяемого объекта (ссылка на атрибут, подписка или срез), этот изменяемый объект должен в конечном итоге выполнить присваивание и решить, допустимо ли оно, и может возбудить исключение, если присваивание неприемлемо. Правила, соблюдаемые различными типами, и возбуждаемые исключения приведены в описании типов объектов (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.4/reference/datamodel.html#types)).6465Присваивание объекта списку целей, возможно заключённому в круглые или квадратные скобки, рекурсивно определяется следующим образом.6667- Если список целей состоит из одной цели: объект присваивается этой цели.68- Если список целей представляет собой разделённый запятыми список целей: объект должен быть итерабельным объектом с тем же количеством элементов, что и целей в списке целей, и элементы присваиваются слева направо соответствующим целям.6970 - Если список целей содержит одну цель с префиксом-звёздочкой, называемую «звёздной» целью: объект должен быть последовательностью, содержащей как минимум столько же элементов, сколько целей в списке целей, минус один. Первые элементы последовательности присваиваются слева направо целям, находящимся перед звёздной целью. Последние элементы последовательности присваиваются целям, находящимся после звёздной цели. Затем список оставшихся элементов последовательности присваивается звёздной цели (список может быть пустым).71 - Иначе: объект должен быть последовательностью с тем же количеством элементов, что и целей в списке целей, и элементы присваиваются слева направо соответствующим целям.7273Присваивание объекта одной цели рекурсивно определяется следующим образом.7475- Если цель является идентификатором (именем):7677 - Если имя не встречается в инструкции [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) или [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal) в текущем блоке кода: имя привязывается к объекту в текущем локальном пространстве имён.78 - Иначе: имя привязывается к объекту в глобальном пространстве имён или во внешнем пространстве имён, определяемом инструкцией [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal), соответственно.7980 Имя перепривязывается, если оно уже было привязано. Это может привести к тому, что счётчик ссылок на объект, ранее привязанный к имени, достигнет нуля, что вызовет освобождение объекта и вызов его деструктора (если он есть).81- Если цель представляет собой список целей, заключённый в круглые или квадратные скобки: объект должен быть итерабельным объектом с тем же количеством элементов, что и целей в списке целей, и его элементы присваиваются слева направо соответствующим целям.82- Если цель является ссылкой на атрибут: вычисляется первичное выражение в ссылке. Оно должно дать объект с присваиваемыми атрибутами; если это не так, возбуждается [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Затем этому объекту даётся указание присвоить присваиваемый объект данному атрибуту; если он не может выполнить присваивание, он возбуждает исключение (обычно, но не обязательно [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError)).8384 Примечание: Если объект является экземпляром класса и ссылка на атрибут встречается по обе стороны оператора присваивания, выражение в правой части, `a.x`, может обращаться как к атрибуту экземпляра, так и (если атрибут экземпляра отсутствует) к атрибуту класса. Цель в левой части `a.x` всегда устанавливается как атрибут экземпляра, при необходимости создавая его. Таким образом, два вхождения `a.x` не обязательно ссылаются на один и тот же атрибут: если выражение в правой части ссылается на атрибут класса, левая часть создаёт новый атрибут экземпляра в качестве цели присваивания:8586 ```python87 class Cls:88 x = 3 # переменная класса89 inst = Cls()90 inst.x = inst.x + 1 # записывает inst.x как 4, оставляя Cls.x равным 391 ```9293 Это описание не обязательно применимо к атрибутам-дескрипторам, таким как свойства, созданные с помощью [`property()`](https://python-all.ru/3.4/library/functions.html#property).94- Если цель – подписка: вычисляется первичное выражение в ссылке. Оно должно дать либо изменяемый последовательный объект (например, список), либо отображающий объект (например, словарь). Затем вычисляется выражение индекса.9596 Если первичным является изменяемый объект-последовательность (например, список), индекс должен давать целое число. Если он отрицательный, к нему добавляется длина последовательности. Результирующее значение должно быть неотрицательным целым числом, меньшим длины последовательности, и последовательности даётся указание присвоить присваиваемый объект её элементу с этим индексом. Если индекс выходит за пределы диапазона, возбуждается [`IndexError`](https://python-all.ru/3.4/library/exceptions.html#IndexError) (присваивание индексированной последовательности не может добавить новые элементы в список).9798 Если первичный объект является отображением (например, словарём), то индекс должен иметь тип, совместимый с типом ключа отображения, и отображению предлагается создать пару ключ/значение, которая сопоставляет индекс с присваиваемым объектом. Это может либо заменить существующую пару ключ/значение с тем же значением ключа, либо вставить новую пару ключ/значение (если ключа с таким значением не существовало).99100 Для пользовательских объектов вызывается метод [`__setitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__setitem__) с соответствующими аргументами.101- Если цель – срез: вычисляется первичное выражение в ссылке. Оно должно дать изменяемый последовательный объект (например, список). Присваиваемый объект должен быть последовательным объектом того же типа. Затем вычисляются выражения нижней и верхней границ, если они присутствуют; по умолчанию используются ноль и длина последовательности. Границы должны вычисляться в целые числа. Если какая-либо граница отрицательна, к ней прибавляется длина последовательности. Полученные границы обрезаются так, чтобы они находились в диапазоне от нуля до длины последовательности включительно. Наконец, последовательный объект заменяет срез элементами присваиваемой последовательности. Длина среза может отличаться от длины присваиваемой последовательности, тем самым изменяя длину целевой последовательности, если целевая последовательность это допускает.102103**Особенность реализации CPython:** В текущей реализации синтаксис целей считается таким же, как для выражений, и недопустимый синтаксис отбрасывается на этапе генерации кода, что приводит к менее подробным сообщениям об ошибках.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.4/reference/simple_stmts.html) - Расширенная распаковка итерируемых объектов**117>118> Спецификация для возможности119>120> `*target`121>122> .123124### 7.2.1. Составные инструкции присваивания125126Составное присваивание – это объединение в одном операторе бинарной операции и оператора присваивания:127128```129130augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)131augtarget ::= identifier | attributeref | subscription | slicing132augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="133 | ">>=" | "<<=" | "&=" | "^=" | "|="134```135136(См. раздел [*Первичные выражения*](https://python-all.ru/3.4/reference/expressions.html#primaries) для определений синтаксиса последних трёх символов.)137138Составное присваивание вычисляет цель (которая, в отличие от обычных операторов присваивания, не может быть распаковкой) и список выражений, выполняет бинарную операцию, соответствующую типу присваивания, над двумя операндами и присваивает результат исходной цели. Цель вычисляется только один раз.139140Составное присваивание вида `x += 1` можно переписать как `x = x + 1`, чтобы получить похожий, но не совсем эквивалентный эффект. В составном варианте `x` вычисляется только один раз. Кроме того, когда это возможно, сама операция выполняется *на месте*, то есть вместо создания нового объекта и присваивания его цели старый объект изменяется.141142В отличие от обычных присваиваний, составные присваивания вычисляют левую часть *до* вычисления правой части. Например, `a[i] += f(x)` сначала обращается к `a[i]`, затем вычисляет `f(x)` и выполняет сложение, и, наконец, записывает результат обратно в `a[i]`.143144За исключением присваивания кортежам и нескольким целям в одном операторе, присваивание, выполняемое составными операторами присваивания, обрабатывается так же, как и обычные присваивания. Аналогично, за исключением возможного поведения *на месте*, бинарная операция, выполняемая составным присваиванием, совпадает с обычными бинарными операциями.145146Для целей, являющихся ссылками на атрибуты, действует то же [*предостережение относительно атрибутов класса и экземпляра*](https://python-all.ru/3.4/reference/simple_stmts.html#attr-target-note), что и для обычных присваиваний.147148## 7.3. Инструкция [`assert`](https://python-all.ru/3.4/reference/simple_stmts.html#assert)149150Операторы assert – это удобный способ вставить отладочные утверждения в программу:151152```153154assert_stmt ::= "assert" expression ["," expression]155```156157Простая форма, `assert expression`, эквивалентна158159```python160if __debug__:161 if not expression: raise AssertionError162```163164Расширенная форма, `assert expression1, expression2`, эквивалентна165166```python167if __debug__:168 if not expression1: raise AssertionError(expression2)169```170171Эти эквивалентности предполагают, что [`__debug__`](https://python-all.ru/3.4/library/constants.html#__debug__) и [`AssertionError`](https://python-all.ru/3.4/library/exceptions.html#AssertionError) ссылаются на встроенные переменные с такими именами. В текущей реализации встроенная переменная [`__debug__`](https://python-all.ru/3.4/library/constants.html#__debug__) равна `True` в обычных условиях и `False` при запросе оптимизации (опция командной строки -O). Текущий генератор кода не генерирует никакого кода для инструкции assert, если оптимизация запрошена во время компиляции. Обратите внимание, что нет необходимости включать исходный код выражения, которое не сработало, в сообщение об ошибке; он будет отображён как часть трассировки стека.172173Присваивания [`__debug__`](https://python-all.ru/3.4/library/constants.html#__debug__) недопустимы. Значение встроенной переменной определяется при запуске интерпретатора.174175## 7.4. Инструкция [`pass`](https://python-all.ru/3.4/reference/simple_stmts.html#pass)176177```178179pass_stmt ::= "pass"180```181182[`pass`](https://python-all.ru/3.4/reference/simple_stmts.html#pass) – это пустая операция: при её выполнении ничего не происходит. Она полезна в качестве заполнителя, когда синтаксически требуется инструкция, но никакой код выполнять не нужно, например:183184```python185def f(arg): pass # функция, которая пока ничего не делает186187class C: pass # класс без методов (пока)188```189190## 7.5. Инструкция [`del`](https://python-all.ru/3.4/reference/simple_stmts.html#del)191192```193194del_stmt ::= "del" target_list195```196197Удаление рекурсивно определяется очень похоже на то, как определяется присваивание. Вместо подробного изложения приведём несколько подсказок.198199Удаление списка целей рекурсивно удаляет каждую цель слева направо.200201Удаление имени удаляет привязку этого имени из локального или глобального пространства имён в зависимости от того, встречается ли имя в инструкции [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) в том же блоке кода. Если имя не привязано, будет возбуждено исключение [`NameError`](https://python-all.ru/3.4/library/exceptions.html#NameError).202203Удаление ссылок на атрибуты, подписок и срезов передаётся соответствующему первичному объекту; удаление среза в общем случае эквивалентно присваиванию пустого среза правильного типа (но даже это определяется объектом, из которого берётся срез).204205Изменено в версии 3.2: Ранее было недопустимо удалять имя из локального пространства имён, если оно является свободной переменной во вложенном блоке.206207## 7.6. Инструкция [`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return)208209```210211return_stmt ::= "return" [expression_list]212```213214[`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return) может синтаксически встречаться только внутри определения функции, а не внутри вложенного определения класса.215216Если список выражений присутствует, он вычисляется, иначе подставляется `None`.217218[`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return) завершает текущий вызов функции, возвращая список выражений (или `None`) в качестве возвращаемого значения.219220Когда [`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return) передаёт управление из инструкции [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) выполняется перед тем, как функция действительно завершится.221222В генераторной функции инструкция [`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return) указывает, что генератор завершён, и вызывает [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration). Возвращаемое значение (если есть) используется как аргумент для создания [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration) и становится атрибутом `StopIteration.value`.223224## 7.7. Инструкция [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield)225226```227228yield_stmt ::= yield_expression229```230231Инструкция [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield) семантически эквивалентна [*выражению yield*](https://python-all.ru/3.4/reference/expressions.html#yieldexpr). Инструкцию yield можно использовать, чтобы опустить скобки, которые иначе потребовались бы в эквивалентном выражении yield. Например, инструкции yield232233```python234yield <expr>235yield from <expr>236```237238эквивалентны выражениям-операторам yield.239240```python241(yield <expr>)242(yield from <expr>)243```244245Yield-выражения и инструкции используются только при определении [*функции-генератора*](https://python-all.ru/3.4/glossary.html#term-generator) и только в теле этой функции. Использования yield в определении функции достаточно, чтобы это определение создавало функцию-генератор вместо обычной функции.246247Подробные сведения о семантике [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield) см. в разделе [*Выражения yield*](https://python-all.ru/3.4/reference/expressions.html#yieldexpr).248249## 7.8. Инструкция [`raise`](https://python-all.ru/3.4/reference/simple_stmts.html#raise)250251```252253raise_stmt ::= "raise" [expression ["from" expression]]254```255256Если выражения отсутствуют, [`raise`](https://python-all.ru/3.4/reference/simple_stmts.html#raise) повторно возбуждает последнее исключение, которое было активно в текущей области видимости. Если в текущей области нет активного исключения, возбуждается исключение [`RuntimeError`](https://python-all.ru/3.4/library/exceptions.html#RuntimeError), указывающее на ошибку.257258В противном случае [`raise`](https://python-all.ru/3.4/reference/simple_stmts.html#raise) вычисляет первое выражение как объект исключения. Оно должно быть подклассом или экземпляром [`BaseException`](https://python-all.ru/3.4/library/exceptions.html#BaseException). Если это класс, экземпляр исключения будет получен при необходимости путём инстанцирования класса без аргументов.259260*Типом* исключения является класс экземпляра исключения, *значением* – сам экземпляр.261262Объект traceback обычно создаётся автоматически при возбуждении исключения и прикрепляется к нему как атрибут `__traceback__`, который доступен для записи. Можно создать исключение и установить свой собственный traceback за один шаг с помощью метода исключения `with_traceback()` (который возвращает тот же экземпляр исключения, установив его traceback равным аргументу), например:263264```python265raise Exception("foo occurred").with_traceback(tracebackobj)266```267268Предложение `from` используется для связывания исключений: если оно указано, второе *выражение* должно быть другим классом или экземпляром исключения, которое затем будет прикреплено к возбуждённому исключению как атрибут `__cause__` (доступный для записи). Если возбуждённое исключение не перехвачено, оба исключения будут выведены:269270```python271>>> try:272... print(1 / 0)273... except Exception as exc:274... raise RuntimeError("Something bad happened") from exc275...276Traceback (most recent call last):277 File "<stdin>", line 2, in <module>278ZeroDivisionError: int division or modulo by zero279280The above exception was the direct cause of the following exception:281282Traceback (most recent call last):283 File "<stdin>", line 4, in <module>284RuntimeError: Something bad happened285```286287Аналогичный механизм работает неявно, если исключение возбуждается внутри обработчика исключений или блока [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally): предыдущее исключение тогда прикрепляется как атрибут `__context__` нового исключения:288289```python290>>> try:291... print(1 / 0)292... except:293... raise RuntimeError("Something bad happened")294...295Traceback (most recent call last):296 File "<stdin>", line 2, in <module>297ZeroDivisionError: int division or modulo by zero298299During handling of the above exception, another exception occurred:300301Traceback (most recent call last):302 File "<stdin>", line 4, in <module>303RuntimeError: Something bad happened304```305306Дополнительную информацию об исключениях можно найти в разделе [*Исключения*](https://python-all.ru/3.4/reference/executionmodel.html#exceptions), а информацию об обработке исключений – в разделе [*Оператор try*](https://python-all.ru/3.4/reference/compound_stmts.html#try).307308## 7.9. Инструкция [`break`](https://python-all.ru/3.4/reference/simple_stmts.html#break)309310```311312break_stmt ::= "break"313```314315[`break`](https://python-all.ru/3.4/reference/simple_stmts.html#break) может находиться только синтаксически вложенным в цикл [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.4/reference/compound_stmts.html#while), но не внутри определения функции или класса внутри этого цикла.316317Он завершает ближайший охватывающий цикл, пропуская необязательное предложение [`else`](https://python-all.ru/3.4/reference/compound_stmts.html#else), если у цикла оно есть.318319Если цикл [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) прерывается [`break`](https://python-all.ru/3.4/reference/simple_stmts.html#break), целевая переменная цикла сохраняет своё текущее значение.320321Когда [`break`](https://python-all.ru/3.4/reference/simple_stmts.html#break) передаёт управление из инструкции [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) выполняется перед тем, как действительно выйти из цикла.322323## 7.10. Инструкция [`continue`](https://python-all.ru/3.4/reference/simple_stmts.html#continue)324325```326327continue_stmt ::= "continue"328```329330[`continue`](https://python-all.ru/3.4/reference/simple_stmts.html#continue) может находиться только синтаксически вложенным в цикл [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.4/reference/compound_stmts.html#while), но не внутри определения функции или класса, а также не внутри блока [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) внутри этого цикла. Он переходит к следующей итерации ближайшего охватывающего цикла.331332Когда [`continue`](https://python-all.ru/3.4/reference/simple_stmts.html#continue) передаёт управление из инструкции [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) выполняется перед началом следующей итерации цикла.333334## 7.11. Инструкция [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)335336```337338import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*339 | "from" relative_module "import" identifier ["as" name]340 ( "," identifier ["as" name] )*341 | "from" relative_module "import" "(" identifier ["as" name]342 ( "," identifier ["as" name] )* [","] ")"343 | "from" module "import" "*"344module ::= (identifier ".")* identifier345relative_module ::= "."* module | "."+346name ::= identifier347```348349Базовая инструкция import (без предложения [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from)) выполняется в два шага:3503511. найти модуль, загрузив и проинициализировав его при необходимости3522. определить имя или имена в локальном пространстве имён для области видимости, в которой встречается инструкция [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import).353354Когда инструкция содержит несколько предложений (разделённых запятыми), два шага выполняются отдельно для каждого предложения, как если бы предложения были разделены на отдельные инструкции import.355356Подробности первого шага – поиск и загрузка модулей – описаны в разделе [*система импорта*](https://python-all.ru/3.4/reference/import.html#importsystem), который также описывает различные типы пакетов и модулей, которые можно импортировать, а также все хуки, которые можно использовать для настройки системы импорта. Обратите внимание, что сбои на этом этапе могут указывать либо на то, что модуль не удалось найти, *или* на то, что произошла ошибка при инициализации модуля, включая выполнение кода модуля.357358Если запрошенный модуль успешно получен, он становится доступным в локальном пространстве имен одним из трёх способов:359360- Если за именем модуля следует [`as`](https://python-all.ru/3.4/reference/compound_stmts.html#as), то имя после [`as`](https://python-all.ru/3.4/reference/compound_stmts.html#as) связывается непосредственно с импортированным модулем.361- Если не указано другое имя и импортируемый модуль является модулем верхнего уровня, имя модуля привязывается в локальном пространстве имен как ссылка на импортированный модуль.362- Если импортируемый модуль *не* является модулем верхнего уровня, то имя пакета верхнего уровня, содержащего этот модуль, привязывается в локальном пространстве имен как ссылка на пакет верхнего уровня. Импортированный модуль должен быть доступен по его полному квалифицированному имени, а не напрямую.363364Форма [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from) использует несколько более сложный процесс:3653661. найти модуль, указанный в предложении [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from), загрузить и инициализировать его, если необходимо;3672. для каждого из идентификаторов, указанных в предложениях [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import):368369 1. проверить, имеет ли импортированный модуль атрибут с таким именем370 2. если нет, попытаться импортировать подмодуль с таким именем, а затем снова проверить импортированный модуль на наличие этого атрибута371 3. если атрибут не найден, возбуждается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).372 4. в противном случае ссылка на это значение сохраняется в локальном пространстве имён с использованием имени из предложения [`as`](https://python-all.ru/3.4/reference/compound_stmts.html#as), если оно присутствует, в противном случае – с использованием имени атрибута373374Примеры:375376```python377import foo # foo импортирован и привязан локально378import foo.bar.baz # foo.bar.baz импортирован, foo привязан локально379import foo.bar.baz as fbb # foo.bar.baz импортирован и привязан как fbb380from foo.bar import baz # foo.bar.baz импортирован и привязан как baz381from foo import attr # foo импортирован и foo.attr привязан как attr382```383384Если список идентификаторов заменён звёздочкой (`'*'`), все публичные имена, определённые в модуле, связываются в локальном пространстве имён для области видимости, в которой встречается инструкция [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import).385386*Публичные имена*, определённые модулем, определяются путём проверки пространства имён модуля на наличие переменной с именем `__all__`; если она определена, то должна быть последовательностью строк, которые являются именами, определёнными или импортированными этим модулем. Имена, указанные в `__all__`, считаются публичными и должны существовать. Если `__all__` не определена, набор публичных имён включает все имена, найденные в пространстве имён модуля, которые не начинаются с символа подчёркивания (`'_'`). `__all__` должна содержать весь публичный API. Она предназначена для предотвращения случайного экспорта элементов, не являющихся частью API (таких как библиотечные модули, которые были импортированы и использованы внутри модуля).387388Групповая форма импорта – `from module import *` – разрешена только на уровне модуля. Попытка использовать её в определениях класса или функции вызовет [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError).389390Указывая, какой модуль импортировать, не обязательно задавать абсолютное имя модуля. Если модуль или пакет находится внутри другого пакета, можно сделать относительный импорт в пределах того же самого верхнего пакета, не указывая имя пакета. Используя ведущие точки в имени модуля или пакета после [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from), можно задать, на сколько уровней подняться вверх по иерархии текущего пакета, не указывая точные имена. Одна ведущая точка означает текущий пакет, в котором находится модуль, выполняющий импорт. Две точки – подняться на один уровень пакета. Три точки – на два уровня и так далее. Так, если выполнить `from . import mod` из модуля в пакете `pkg`, то в итоге будет импортирован `pkg.mod`. Если выполнить `from ..subpkg2 import mod` внутри `pkg.subpkg1`, то будет импортирован `pkg.subpkg2.mod`. Спецификация относительных импортов содержится в [**PEP 328**](https://python-all.ru/3.4/reference/simple_stmts.html).391392[`importlib.import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module) предоставляется для поддержки приложений, которые динамически определяют модули для загрузки.393394### 7.11.1. Инструкции future395396*Future-оператор* – это указание компилятору, что определённый модуль должен быть скомпилирован с использованием синтаксиса или семантики, которые будут доступны в определённом будущем выпуске Python, где эта возможность станет стандартной.397398Инструкция future предназначена для упрощения перехода на будущие версии Python, в которых вносятся несовместимые изменения в язык. Она позволяет использовать новые возможности на уровне отдельных модулей до выхода версии, в которой эта возможность становится стандартной.399400```401402future_statement ::= "from" "__future__" "import" feature ["as" name]403 ("," feature ["as" name])*404 | "from" "__future__" "import" "(" feature ["as" name]405 ("," feature ["as" name])* [","] ")"406feature ::= identifier407name ::= identifier408```409410Инструкция future должна располагаться в начале модуля. До инструкции future могут находиться только:411412- строка документации модуля (если есть),413- комментарии,414- пустые строки и415- другие инструкции future.416417Возможности, распознаваемые Python 3.0: `absolute_import`, `division`, `generators`, `unicode_literals`, `print_function`, `nested_scopes` и `with_statement`. Все они избыточны, поскольку всегда включены, и сохранены только для обратной совместимости.418419Инструкция future распознаётся и обрабатывается особым образом на этапе компиляции: изменения семантики ключевых конструкций часто реализуются путём генерации другого кода. Может даже случиться так, что новая возможность вводит новый несовместимый синтаксис (например, новое зарезервированное слово), и тогда компилятору может потребоваться разбирать модуль иначе. Такие решения нельзя откладывать до выполнения.420421Для любого конкретного выпуска компилятор знает, какие имена возможностей определены, и выдаёт ошибку на этапе компиляции, если инструкция future содержит неизвестную ему возможность.422423Непосредственная семантика выполнения та же, что и для любого оператора import: существует стандартный модуль [`__future__`](https://python-all.ru/3.4/library/__future__.html#module-__future__), описанный далее, и он будет импортирован обычным образом в момент выполнения future-оператора.424425Интересная семантика времени выполнения зависит от конкретной возможности, включаемой инструкцией future.426427Обратите внимание, что в этой инструкции нет ничего особенного:428429```python430import __future__ [as name]431```432433Это не инструкция future, а обычная инструкция import без особой семантики или синтаксических ограничений.434435Код, скомпилированный вызовами встроенных функций [`exec()`](https://python-all.ru/3.4/library/functions.html#exec) и [`compile()`](https://python-all.ru/3.4/library/functions.html#compile), которые встречаются в модуле `M`, содержащем future-оператор, по умолчанию будет использовать новый синтаксис или семантику, связанную с этим future-оператором. Это можно контролировать с помощью необязательных аргументов [`compile()`](https://python-all.ru/3.4/library/functions.html#compile) – подробнее см. документацию этой функции.436437Future-оператор, введённый в интерактивном режиме интерпретатора, вступит в силу на оставшуюся часть сеанса интерпретатора. Если интерпретатор запущен с флагом [*-i*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-i), ему передано имя скрипта для выполнения, и скрипт содержит future-оператор, то этот оператор будет действовать в интерактивном сеансе, запущенном после выполнения скрипта.438439> **См. также**440>441> **[**PEP 236**](https://python-all.ru/3.4/reference/simple_stmts.html) – Назад в \_\_future\_\_**442>443> Оригинальное предложение механизма \_\_future\_\_.444445## 7.12. Оператор [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global)446447```448449global_stmt ::= "global" identifier ("," identifier)*450```451452Оператор [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) – это объявление, действующее на весь текущий блок кода. Оно означает, что перечисленные идентификаторы следует интерпретировать как глобальные. Без [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) было бы невозможно присваивать значения глобальным переменным, хотя свободные переменные могут ссылаться на глобальные, не будучи объявленными глобальными.453454Имена, перечисленные в операторе [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global), не должны использоваться в том же блоке кода текстуально до этого оператора [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global).455456Имена, перечисленные в операторе [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global), не должны быть определены как формальные параметры или как цель управления циклом в [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for), или в определении [`class`](https://python-all.ru/3.4/reference/compound_stmts.html#class), определения функции, или в операторе [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import).457458**Деталь реализации CPython:** Текущая реализация не применяет эти два ограничения, но программам не следует злоупотреблять этой свободой, поскольку будущие реализации могут применять их или незаметно изменить смысл программы.459460**Замечание для программистов:** [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) – это директива для парсера. Она применяется только к коду, который анализируется одновременно с оператором [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global). В частности, оператор [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global), содержащийся в строке или объекте кода, переданном встроенной функции [`exec()`](https://python-all.ru/3.4/library/functions.html#exec), не влияет на блок кода, *содержащий* вызов функции, и код, содержащийся в такой строке, не подвержен влиянию операторов [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global) в коде, содержащем вызов функции. То же самое касается функций [`eval()`](https://python-all.ru/3.4/library/functions.html#eval) и [`compile()`](https://python-all.ru/3.4/library/functions.html#compile).461462## 7.13. Оператор [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal)463464```465466nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*467```468469Оператор [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal) заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшей охватывающей области видимости, исключая глобальные. Это важно, поскольку по умолчанию при связывании сначала просматривается локальная область. Оператор позволяет инкапсулированному коду переназначать переменные за пределами локальной области, помимо глобальной (модульной).470471Имена, перечисленные в операторе [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal), в отличие от перечисленных в операторе [`global`](https://python-all.ru/3.4/reference/simple_stmts.html#global), должны ссылаться на уже существующие привязки в охватывающей области (область, в которой следует создать новую привязку, не может быть однозначно определена).472473Имена, перечисленные в операторе [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal), не должны конфликтовать с уже существующими привязками в локальной области.474475> **См. также**476>477> **[**PEP 3104**](https://python-all.ru/3.4/reference/simple_stmts.html) – доступ к именам во внешних областях видимости**478>479> Спецификация оператора480>481> [`nonlocal`](https://python-all.ru/3.4/reference/simple_stmts.html#nonlocal)482>483> .484