simple_stmts.md
1> **Источник:** https://python-all.ru/3.5/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 ::= starred_expression36```3738Инструкция-выражение вычисляет список выражений (который может быть одиночным выражением).3940В интерактивном режиме, если значение не равно `None`, оно преобразуется в строку с помощью встроенной функции [`repr()`](https://python-all.ru/3.5/library/functions.html#repr), и полученная строка выводится в стандартный вывод на отдельной строке (за исключением случая, когда результат равен `None`, чтобы вызовы процедур не приводили к выводу).4142## 7.2. Инструкции присваивания4344Инструкции присваивания используются для (пере)привязки имён к значениям и изменения атрибутов или элементов изменяемых объектов:4546```4748assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)49target_list ::= target ("," target)* [","]50target ::= identifier51 | "(" target_list ")"52 | "[" [target_list] "]"53 | attributeref54 | subscription55 | slicing56 | "*" target57```5859(См. раздел [Первичные выражения](https://python-all.ru/3.5/reference/expressions.html#primaries) с определениями синтаксиса для *attributeref*, *subscription* и *slicing*.)6061Инструкция присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделённый запятыми, последний даёт кортеж) и присваивает единственный результирующий объект каждому из списков целей, слева направо.6263Присваивание определяется рекурсивно в зависимости от формы цели (списка). Если цель является частью изменяемого объекта (ссылка на атрибут, подписка или срез), этот изменяемый объект должен в конечном итоге выполнить присваивание и решить, допустимо ли оно, и может возбудить исключение, если присваивание неприемлемо. Правила, соблюдаемые различными типами, и возбуждаемые исключения приведены в описании типов объектов (см. раздел [Стандартная иерархия типов](https://python-all.ru/3.5/reference/datamodel.html#types)).6465Присваивание объекта списку целей, возможно заключённому в круглые или квадратные скобки, рекурсивно определяется следующим образом.6667- Если список целей пуст: объект также должен быть пустым итерируемым объектом.68- Если список целей состоит из одной цели в скобках: объект присваивается этой цели.69- Если список целей представляет собой список целей, разделённых запятыми, или одну цель в квадратных скобках: объект должен быть итерируемым объектом с тем же количеством элементов, сколько целей в списке целей, и элементы присваиваются слева направо соответствующим целям.7071 - Если список целей содержит одну цель с префиксом в виде звёздочки, называемую «звёздной» целью: объект должен быть итерируемым, содержащим как минимум столько же элементов, сколько целей в списке целей, минус один. Первые элементы итерируемого объекта присваиваются, слева направо, целям перед звёздной целью. Последние элементы итерируемого объекта присваиваются целям после звёздной цели. Затем список оставшихся элементов итерируемого объекта присваивается звёздной цели (список может быть пустым).72 - Иначе: объект должен быть итерируемым с тем же количеством элементов, сколько целей в списке целей, и элементы присваиваются, слева направо, соответствующим целям.7374Присваивание объекта одной цели рекурсивно определяется следующим образом.7576- Если цель является идентификатором (именем):7778 - Если имя не встречается в инструкции [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) или [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal) в текущем блоке кода: имя привязывается к объекту в текущем локальном пространстве имён.79 - В противном случае: имя привязывается к объекту в глобальном пространстве имён или во внешнем пространстве имён, определяемом [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal), соответственно.8081 Имя перепривязывается, если оно уже было привязано. Это может привести к тому, что счётчик ссылок на объект, ранее привязанный к имени, достигнет нуля, что вызовет освобождение объекта и вызов его деструктора (если он есть).82- Если цель является ссылкой на атрибут: вычисляется первичное выражение в ссылке. Оно должно давать объект с назначаемыми атрибутами; если это не так, возбуждается [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError). Затем этому объекту предлагается присвоить заданный объект указанному атрибуту; если он не может выполнить присваивание, он возбуждает исключение (обычно, но не обязательно [`AttributeError`](https://python-all.ru/3.5/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.5/library/functions.html#property).94- Если цель – подписка: вычисляется первичное выражение в ссылке. Оно должно дать либо изменяемый последовательный объект (например, список), либо отображающий объект (например, словарь). Затем вычисляется выражение индекса.9596 Если первичный объект является изменяемой последовательностью (например, списком), индекс должен давать целое число. Если оно отрицательное, к нему прибавляется длина последовательности. Результирующее значение должно быть неотрицательным целым числом, меньшим длины последовательности, и последовательности предлагается присвоить присваиваемый объект её элементу с этим индексом. Если индекс выходит за пределы диапазона, возбуждается [`IndexError`](https://python-all.ru/3.5/library/exceptions.html#IndexError) (присваивание индексированной последовательности не может добавить новые элементы в список).9798 Если первичный объект является отображением (например, словарём), то индекс должен иметь тип, совместимый с типом ключа отображения, и отображению предлагается создать пару ключ/значение, которая сопоставляет индекс с присваиваемым объектом. Это может либо заменить существующую пару ключ/значение с тем же значением ключа, либо вставить новую пару ключ/значение (если ключа с таким значением не существовало).99100 Для пользовательских объектов вызывается метод [`__setitem__()`](https://python-all.ru/3.5/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.5/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.5/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.5/reference/simple_stmts.html#attr-target-note), что и для обычных присваиваний.147148## 7.3. Инструкция [`assert`](https://python-all.ru/3.5/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.5/library/constants.html#__debug__) и [`AssertionError`](https://python-all.ru/3.5/library/exceptions.html#AssertionError) ссылаются на встроенные переменные с этими именами. В текущей реализации встроенная переменная [`__debug__`](https://python-all.ru/3.5/library/constants.html#__debug__) равна `True` при обычных обстоятельствах и `False` при запросе оптимизации (параметр командной строки -O). Текущий генератор кода не создаёт код для инструкции assert, если оптимизация запрошена во время компиляции. Обратите внимание, что нет необходимости включать исходный код выражения, которое не удалось выполнить, в сообщение об ошибке; оно будет отображено как часть трассировки стека.172173Присваивания [`__debug__`](https://python-all.ru/3.5/library/constants.html#__debug__) запрещены. Значение встроенной переменной определяется при запуске интерпретатора.174175## 7.4. Инструкция [`pass`](https://python-all.ru/3.5/reference/simple_stmts.html#pass)176177```178179pass_stmt ::= "pass"180```181182[`pass`](https://python-all.ru/3.5/reference/simple_stmts.html#pass) – пустая операция; при её выполнении ничего не происходит. Она полезна в качестве заполнителя, когда синтаксически требуется оператор, но выполнять код не нужно, например:183184```python185def f(arg): pass # функция, которая пока ничего не делает186187class C: pass # класс без методов (пока)188```189190## 7.5. Инструкция [`del`](https://python-all.ru/3.5/reference/simple_stmts.html#del)191192```193194del_stmt ::= "del" target_list195```196197Удаление рекурсивно определяется очень похоже на то, как определяется присваивание. Вместо подробного изложения приведём несколько подсказок.198199Удаление списка целей рекурсивно удаляет каждую цель слева направо.200201Удаление имени удаляет привязку этого имени из локального или глобального пространства имён в зависимости от того, встречается ли имя в операторе [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) в том же блоке кода. Если имя не связано, вызывается исключение [`NameError`](https://python-all.ru/3.5/library/exceptions.html#NameError).202203Удаление ссылок на атрибуты, подписок и срезов передаётся соответствующему первичному объекту; удаление среза в общем случае эквивалентно присваиванию пустого среза правильного типа (но даже это определяется объектом, из которого берётся срез).204205Изменено в версии 3.2: Ранее было недопустимо удалять имя из локального пространства имён, если оно является свободной переменной во вложенном блоке.206207## 7.6. Инструкция [`return`](https://python-all.ru/3.5/reference/simple_stmts.html#return)208209```210211return_stmt ::= "return" [expression_list]212```213214[`return`](https://python-all.ru/3.5/reference/simple_stmts.html#return) может синтаксически встречаться только внутри определения функции, а не внутри определения вложенного класса.215216Если указан список выражений, он вычисляется, иначе подставляется `None`.217218[`return`](https://python-all.ru/3.5/reference/simple_stmts.html#return) завершает текущий вызов функции, возвращая список выражений (или `None`).219220Когда [`return`](https://python-all.ru/3.5/reference/simple_stmts.html#return) передаёт управление из оператора [`try`](https://python-all.ru/3.5/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally), это предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally) выполняется перед фактическим выходом из функции.221222В генераторной функции оператор [`return`](https://python-all.ru/3.5/reference/simple_stmts.html#return) указывает, что генератор завершён, и вызовет [`StopIteration`](https://python-all.ru/3.5/library/exceptions.html#StopIteration). Возвращаемое значение (если есть) используется как аргумент для создания [`StopIteration`](https://python-all.ru/3.5/library/exceptions.html#StopIteration) и становится атрибутом `StopIteration.value`.223224## 7.7. Инструкция [`yield`](https://python-all.ru/3.5/reference/simple_stmts.html#yield)225226```227228yield_stmt ::= yield_expression229```230231Инструкция [`yield`](https://python-all.ru/3.5/reference/simple_stmts.html#yield) семантически эквивалентна [yield-выражению](https://python-all.ru/3.5/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.5/glossary.html#term-generator) и только в теле этой функции. Использования yield в определении функции достаточно, чтобы это определение создавало функцию-генератор вместо обычной функции.246247За полными подробностями семантики [`yield`](https://python-all.ru/3.5/reference/simple_stmts.html#yield) обратитесь к разделу [Выражения yield](https://python-all.ru/3.5/reference/expressions.html#yieldexpr).248249## 7.8. Инструкция [`raise`](https://python-all.ru/3.5/reference/simple_stmts.html#raise)250251```252253raise_stmt ::= "raise" [expression ["from" expression]]254```255256Если выражения отсутствуют, [`raise`](https://python-all.ru/3.5/reference/simple_stmts.html#raise) повторно возбуждает последнее исключение, активное в текущей области видимости. Если в текущей области видимости нет активного исключения, возбуждается исключение [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError), указывающее на ошибку.257258В противном случае [`raise`](https://python-all.ru/3.5/reference/simple_stmts.html#raise) вычисляет первое выражение как объект исключения. Оно должно быть подклассом или экземпляром [`BaseException`](https://python-all.ru/3.5/library/exceptions.html#BaseException). Если это класс, экземпляр исключения будет получен при необходимости инстанцированием класса без аргументов.259260*Типом* исключения является класс экземпляра исключения, *значением* – сам экземпляр.261262Объект трассировки обычно создаётся автоматически при возбуждении исключения и присоединяется к нему как атрибут `__traceback__`, который доступен для записи. Можно создать исключение и установить собственную трассировку за один шаг, используя метод `with_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.5/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.5/reference/executionmodel.html#exceptions), а информацию об обработке исключений – в разделе [Оператор try](https://python-all.ru/3.5/reference/compound_stmts.html#try).307308## 7.9. Инструкция [`break`](https://python-all.ru/3.5/reference/simple_stmts.html#break)309310```311312break_stmt ::= "break"313```314315[`break`](https://python-all.ru/3.5/reference/simple_stmts.html#break) может синтаксически находиться только внутри цикла [`for`](https://python-all.ru/3.5/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.5/reference/compound_stmts.html#while), но не внутри определения функции или класса в этом цикле.316317Он завершает ближайший охватывающий цикл, пропуская необязательное предложение [`else`](https://python-all.ru/3.5/reference/compound_stmts.html#else), если оно есть в цикле.318319Если цикл [`for`](https://python-all.ru/3.5/reference/compound_stmts.html#for) завершается оператором [`break`](https://python-all.ru/3.5/reference/simple_stmts.html#break), то целевая переменная цикла сохраняет своё текущее значение.320321Когда [`break`](https://python-all.ru/3.5/reference/simple_stmts.html#break) передаёт управление из оператора [`try`](https://python-all.ru/3.5/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally), это предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally) выполняется перед фактическим выходом из цикла.322323## 7.10. Инструкция [`continue`](https://python-all.ru/3.5/reference/simple_stmts.html#continue)324325```326327continue_stmt ::= "continue"328```329330[`continue`](https://python-all.ru/3.5/reference/simple_stmts.html#continue) может встречаться только синтаксически вложенным в цикл [`for`](https://python-all.ru/3.5/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.5/reference/compound_stmts.html#while), но не вложенным в определение функции или класса или предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally) внутри этого цикла. Она продолжается со следующим витком ближайшего внешнего цикла.331332Когда [`continue`](https://python-all.ru/3.5/reference/simple_stmts.html#continue) передаёт управление из оператора [`try`](https://python-all.ru/3.5/reference/compound_stmts.html#try) с предложением [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally), это предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally) выполняется перед фактическим началом следующей итерации цикла.333334## 7.11. Инструкция [`import`](https://python-all.ru/3.5/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.5/reference/simple_stmts.html#from)) выполняется в два этапа:3503511. найти модуль, загрузив и проинициализировав его при необходимости3522. определяет имя или имена в локальном пространстве имён для области видимости, где встречается оператор [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import).353354Когда оператор содержит несколько частей (разделённых запятыми), два этапа выполняются отдельно для каждой части, точно так, как если бы эти части были разделены на отдельные операторы import.355356Подробности первого шага – поиск и загрузка модулей – описаны в разделе [система импорта](https://python-all.ru/3.5/reference/import.html#importsystem), который также описывает различные типы пакетов и модулей, которые можно импортировать, а также все хуки, которые можно использовать для настройки системы импорта. Обратите внимание, что сбои на этом этапе могут указывать либо на то, что модуль не удалось найти, *или* на то, что произошла ошибка при инициализации модуля, включая выполнение кода модуля.357358Если запрошенный модуль успешно получен, он становится доступным в локальном пространстве имен одним из трёх способов:359360- Если за именем модуля следует [`as`](https://python-all.ru/3.5/reference/compound_stmts.html#as), то имя, следующее за [`as`](https://python-all.ru/3.5/reference/compound_stmts.html#as), привязывается непосредственно к импортированному модулю.361- Если не указано другое имя и импортируемый модуль является модулем верхнего уровня, имя модуля привязывается в локальном пространстве имен как ссылка на импортированный модуль.362- Если импортируемый модуль *не* является модулем верхнего уровня, то имя пакета верхнего уровня, содержащего этот модуль, привязывается в локальном пространстве имен как ссылка на пакет верхнего уровня. Импортированный модуль должен быть доступен по его полному квалифицированному имени, а не напрямую.363364Форма [`from`](https://python-all.ru/3.5/reference/simple_stmts.html#from) использует немного более сложный процесс:3653661. найти модуль, указанный в предложении [`from`](https://python-all.ru/3.5/reference/simple_stmts.html#from), загрузив и проинициализировав его при необходимости;3672. для каждого из идентификаторов, указанных в предложениях [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import):368369 1. проверить, имеет ли импортированный модуль атрибут с таким именем370 2. если нет, попытаться импортировать подмодуль с таким именем, а затем снова проверить импортированный модуль на наличие этого атрибута371 3. если атрибут не найден, возбуждается [`ImportError`](https://python-all.ru/3.5/library/exceptions.html#ImportError).372 4. в противном случае ссылка на это значение сохраняется в локальном пространстве имён, с использованием имени из предложения [`as`](https://python-all.ru/3.5/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.5/reference/simple_stmts.html#import).385386*Публичные имена*, определённые модулем, определяются путём проверки пространства имён модуля на наличие переменной с именем `__all__`; если она определена, это должна быть последовательность строк, которые являются именами, определёнными или импортированными этим модулем. Имена, указанные в `__all__`, все считаются публичными и должны существовать. Если `__all__` не определён, набор публичных имён включает все имена, найденные в пространстве имён модуля, которые не начинаются с символа подчёркивания (`'_'`). `__all__` должен содержать весь публичный API. Это сделано для того, чтобы избежать случайного экспорта элементов, не являющихся частью API (таких как библиотечные модули, которые были импортированы и использованы внутри модуля).387388Групповая форма импорта – `from module import *` – разрешена только на уровне модуля. Попытка использовать её в определениях класса или функции приведёт к возбуждению [`SyntaxError`](https://python-all.ru/3.5/library/exceptions.html#SyntaxError).389390При указании, какой модуль импортировать, необязательно указывать абсолютное имя модуля. Если модуль или пакет содержится внутри другого пакета, можно сделать относительный импорт внутри того же самого верхнего пакета, не упоминая имя пакета. Используя ведущие точки в указанном модуле или пакете после [`from`](https://python-all.ru/3.5/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.5/reference/simple_stmts.html).391392[`importlib.import_module()`](https://python-all.ru/3.5/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.5/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.5/library/functions.html#exec) и [`compile()`](https://python-all.ru/3.5/library/functions.html#compile), которые встречаются в модуле `M`, содержащем инструкцию future, по умолчанию будет использовать новый синтаксис или семантику, связанные с этой инструкцией future. Это можно контролировать с помощью необязательных аргументов [`compile()`](https://python-all.ru/3.5/library/functions.html#compile) – подробнее см. документацию этой функции.436437Инструкция future, введённая в интерактивном приглашении интерпретатора, будет действовать до конца сеанса интерпретатора. Если интерпретатор запущен с опцией [`-i`](https://python-all.ru/3.5/using/cmdline.html#cmdoption-i), ему передано имя выполняемого скрипта, и скрипт содержит инструкцию future, то эта инструкция будет действовать в интерактивном сеансе, который запускается после выполнения скрипта.438439> **См. также**440>441> **[**PEP 236**](https://python-all.ru/3.5/reference/simple_stmts.html) – Назад в \_\_future\_\_**442>443> Оригинальное предложение механизма \_\_future\_\_.444445## 7.12. Инструкция [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global)446447```448449global_stmt ::= "global" identifier ("," identifier)*450```451452Инструкция [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) – это объявление, которое действует на весь текущий блок кода. Она означает, что перечисленные идентификаторы должны интерпретироваться как глобальные. Невозможно было бы присвоить значение глобальной переменной без [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global), хотя свободные переменные могут ссылаться на глобальные, не будучи объявленными как global.453454Имена, перечисленные в инструкции [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global), не должны использоваться в том же блоке кода текстуально перед этой инструкцией [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global).455456Имена, перечисленные в инструкции [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global), не должны быть определены как формальные параметры или как цель управления цикла [`for`](https://python-all.ru/3.5/reference/compound_stmts.html#for), в определении [`class`](https://python-all.ru/3.5/reference/compound_stmts.html#class), определении функции или в инструкции [`import`](https://python-all.ru/3.5/reference/simple_stmts.html#import).457458**Деталь реализации CPython:** Текущая реализация не применяет эти два ограничения, но программам не следует злоупотреблять этой свободой, поскольку будущие реализации могут применять их или незаметно изменить смысл программы.459460**Замечание для программистов:** [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) – это директива для парсера. Она применяется только к коду, который разбирается одновременно с инструкцией [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global). В частности, инструкция [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global), содержащаяся в строке или объекте кода, переданном встроенной функции [`exec()`](https://python-all.ru/3.5/library/functions.html#exec), не влияет на блок кода *, содержащий* вызов функции, а код, содержащийся в такой строке, не подвержен влиянию инструкций [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global) в коде, содержащем вызов функции. То же самое относится к функциям [`eval()`](https://python-all.ru/3.5/library/functions.html#eval) и [`compile()`](https://python-all.ru/3.5/library/functions.html#compile).461462## 7.13. Инструкция [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal)463464```465466nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*467```468469Инструкция [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal) заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшей объемлющей области видимости, исключая глобальные. Это важно, потому что поведение связывания по умолчанию – сначала искать в локальном пространстве имён. Эта инструкция позволяет инкапсулированному коду перепривязывать переменные за пределами локальной области видимости, помимо глобальной (модульной).470471Имена, перечисленные в инструкции [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal), в отличие от перечисленных в инструкции [`global`](https://python-all.ru/3.5/reference/simple_stmts.html#global), должны ссылаться на уже существующие связывания в объемлющей области видимости (область, в которой должно быть создано новое связывание, не может быть однозначно определена).472473Имена, перечисленные в инструкции [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal), не должны конфликтовать с уже существующими связываниями в локальной области видимости.474475> **См. также**476>477> **[**PEP 3104**](https://python-all.ru/3.5/reference/simple_stmts.html) – доступ к именам во внешних областях видимости**478>479> Спецификация инструкции480>481> [`nonlocal`](https://python-all.ru/3.5/reference/simple_stmts.html#nonlocal)482>483> .484