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

simple_stmts.md

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

1> **Источник:** https://python-all.ru/3.3/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.3/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(См. раздел [*Primaries*](https://python-all.ru/3.3/reference/expressions.html#primaries) для определения синтаксиса последних трёх символов.)6061Инструкция присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделённый запятыми, последний даёт кортеж) и присваивает единственный результирующий объект каждому из списков целей, слева направо.6263Присваивание определяется рекурсивно в зависимости от формы цели (списка). Если цель является частью изменяемого объекта (ссылка на атрибут, подписка или срез), этот изменяемый объект должен в конечном итоге выполнить присваивание и решить, допустимо ли оно, и может возбудить исключение, если присваивание неприемлемо. Правила, соблюдаемые различными типами, и возбуждаемые исключения приведены в описании типов объектов (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.3/reference/datamodel.html#types)).6465Присваивание объекта списку целей, возможно заключённому в круглые или квадратные скобки, рекурсивно определяется следующим образом.6667- Если список целей состоит из одной цели: объект присваивается этой цели.68- Если список целей представляет собой разделённый запятыми список целей: объект должен быть итерабельным объектом с тем же количеством элементов, что и целей в списке целей, и элементы присваиваются слева направо соответствующим целям.6970  - Если список целей содержит одну цель с префиксом-звёздочкой, называемую «звёздной» целью: объект должен быть последовательностью, содержащей как минимум столько же элементов, сколько целей в списке целей, минус один. Первые элементы последовательности присваиваются слева направо целям, находящимся перед звёздной целью. Последние элементы последовательности присваиваются целям, находящимся после звёздной цели. Затем список оставшихся элементов последовательности присваивается звёздной цели (список может быть пустым).71  - Иначе: объект должен быть последовательностью с тем же количеством элементов, что и целей в списке целей, и элементы присваиваются слева направо соответствующим целям.7273Присваивание объекта одной цели рекурсивно определяется следующим образом.7475- Если цель является идентификатором (именем):7677  - Если имя не встречается в инструкции [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) или [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal) в текущем блоке кода: имя привязывается к объекту в текущем локальном пространстве имён.78  - Иначе: имя привязывается к объекту в глобальном пространстве имён или во внешнем пространстве имён, определяемом инструкцией [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal), соответственно.7980  Имя перепривязывается, если оно уже было привязано. Это может привести к тому, что счётчик ссылок на объект, ранее привязанный к имени, достигнет нуля, что вызовет освобождение объекта и вызов его деструктора (если он есть).81- Если цель представляет собой список целей, заключённый в круглые или квадратные скобки: объект должен быть итерабельным объектом с тем же количеством элементов, что и целей в списке целей, и его элементы присваиваются слева направо соответствующим целям.82- Если цель является ссылкой на атрибут: вычисляется первичное выражение в ссылке. Оно должно дать объект с присваиваемыми атрибутами; если это не так, возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError). Затем этому объекту даётся указание присвоить присваиваемый объект данному атрибуту; если он не может выполнить присваивание, он возбуждает исключение (обычно, но не обязательно [`AttributeError`](https://python-all.ru/3.3/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.3/library/functions.html#property).94- Если цель – подписка: вычисляется первичное выражение в ссылке. Оно должно дать либо изменяемый последовательный объект (например, список), либо отображающий объект (например, словарь). Затем вычисляется выражение индекса.9596  Если первичным является изменяемый объект-последовательность (например, список), индекс должен давать целое число. Если он отрицательный, к нему добавляется длина последовательности. Результирующее значение должно быть неотрицательным целым числом, меньшим длины последовательности, и последовательности даётся указание присвоить присваиваемый объект её элементу с этим индексом. Если индекс выходит за пределы диапазона, возбуждается [`IndexError`](https://python-all.ru/3.3/library/exceptions.html#IndexError) (присваивание индексированной последовательности не может добавить новые элементы в список).9798  Если первичный объект является отображением (например, словарём), то индекс должен иметь тип, совместимый с типом ключа отображения, и отображению предлагается создать пару ключ/значение, которая сопоставляет индекс с присваиваемым объектом. Это может либо заменить существующую пару ключ/значение с тем же значением ключа, либо вставить новую пару ключ/значение (если ключа с таким значением не существовало).99100  Для пользовательских объектов вызывается метод [`__setitem__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__setitem__) с соответствующими аргументами.101- Если целью является срез: вычисляется первичное выражение в ссылке. Оно должно возвращать изменяемый последовательный объект (например, список). Присваиваемый объект должен быть последовательным объектом того же типа. Затем вычисляются выражения нижней и верхней границы, если они присутствуют; по умолчанию используются ноль и длина последовательности. Границы должны вычисляться как целые числа. Если какая-либо граница отрицательна, к ней прибавляется длина последовательности. Полученные границы обрезаются, чтобы находиться в диапазоне от нуля до длины последовательности включительно. Наконец, объект последовательности запрашивается на замену среза элементами присваиваемой последовательности. Длина среза может отличаться от длины присваиваемой последовательности, тем самым изменяя длину целевой последовательности, если объект это допускает.102103**Особенность реализации CPython:** В текущей реализации синтаксис целей считается таким же, как для выражений, и недопустимый синтаксис отбрасывается на этапе генерации кода, что приводит к менее подробным сообщениям об ошибках.104105ПРЕДУПРЕЖДЕНИЕ: Хотя определение присваивания подразумевает, что пересечения между левой и правой частью «безопасны» (например, `a, b = b, a` меняет местами две переменные), пересечения *внутри* набора переменных, которым присваивается, небезопасны! Например, следующая программа выводит `[0, 2]`:106107```python108x = [0, 1]109i = 0110i, x[i] = 1, 2111print(x)112```113114> **См. также**115>116> **[**PEP 3132**](https://python-all.ru/3.3/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(См. раздел [*Primaries*](https://python-all.ru/3.3/reference/expressions.html#primaries) для определения синтаксиса последних трёх символов.)137138Составное присваивание вычисляет цель (которая, в отличие от обычных операторов присваивания, не может быть распаковкой) и список выражений, выполняет бинарную операцию, соответствующую типу присваивания, над двумя операндами и присваивает результат исходной цели. Цель вычисляется только один раз.139140Составное присваивание вида `x += 1` можно переписать как `x = x + 1`, чтобы получить похожий, но не совсем эквивалентный эффект. В составном варианте `x` вычисляется только один раз. Кроме того, когда это возможно, сама операция выполняется *на месте*, то есть вместо создания нового объекта и присваивания его цели старый объект изменяется.141142За исключением присваивания кортежам и нескольким целям в одном операторе, присваивание, выполняемое составными операторами присваивания, обрабатывается так же, как и обычные присваивания. Аналогично, за исключением возможного поведения *на месте*, бинарная операция, выполняемая составным присваиванием, совпадает с обычными бинарными операциями.143144Для целей, являющихся ссылками на атрибуты, действует то же [*предостережение относительно атрибутов класса и экземпляра*](https://python-all.ru/3.3/reference/simple_stmts.html#attr-target-note), что и для обычных присваиваний.145146## 7.3. Инструкция [`assert`](https://python-all.ru/3.3/reference/simple_stmts.html#assert)147148Операторы assert – это удобный способ вставить отладочные утверждения в программу:149150```151152assert_stmt ::=  "assert" expression ["," expression]153```154155Простая форма, `assert expression`, эквивалентна156157```python158if __debug__:159   if not expression: raise AssertionError160```161162Расширенная форма, `assert expression1, expression2`, эквивалентна163164```python165if __debug__:166   if not expression1: raise AssertionError(expression2)167```168169Эти эквивалентности предполагают, что [`__debug__`](https://python-all.ru/3.3/library/constants.html#__debug__) и [`AssertionError`](https://python-all.ru/3.3/library/exceptions.html#AssertionError) ссылаются на встроенные переменные с такими именами. В текущей реализации встроенная переменная [`__debug__`](https://python-all.ru/3.3/library/constants.html#__debug__) равна `True` в обычных условиях и `False` при запросе оптимизации (опция командной строки -O). Текущий генератор кода не генерирует никакого кода для инструкции assert, если оптимизация запрошена во время компиляции. Обратите внимание, что нет необходимости включать исходный код выражения, которое не сработало, в сообщение об ошибке; он будет отображён как часть трассировки стека.170171Присваивания [`__debug__`](https://python-all.ru/3.3/library/constants.html#__debug__) недопустимы. Значение встроенной переменной определяется при запуске интерпретатора.172173## 7.4. Инструкция [`pass`](https://python-all.ru/3.3/reference/simple_stmts.html#pass)174175```176177pass_stmt ::=  "pass"178```179180[`pass`](https://python-all.ru/3.3/reference/simple_stmts.html#pass) – это пустая операция: при её выполнении ничего не происходит. Она полезна в качестве заполнителя, когда синтаксически требуется инструкция, но никакой код выполнять не нужно, например:181182```python183def f(arg): pass    # функция, которая пока ничего не делает184185class C: pass       # класс без методов (пока)186```187188## 7.5. Инструкция [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del)189190```191192del_stmt ::=  "del" target_list193```194195Удаление рекурсивно определяется очень похоже на то, как определяется присваивание. Вместо подробного изложения приведём несколько подсказок.196197Удаление списка целей рекурсивно удаляет каждую цель слева направо.198199Удаление имени удаляет привязку этого имени из локального или глобального пространства имён в зависимости от того, встречается ли имя в инструкции [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) в том же блоке кода. Если имя не привязано, будет возбуждено исключение [`NameError`](https://python-all.ru/3.3/library/exceptions.html#NameError).200201Удаление ссылок на атрибуты, подписок и срезов передаётся соответствующему первичному объекту; удаление среза в общем случае эквивалентно присваиванию пустого среза правильного типа (но даже это определяется объектом, из которого берётся срез).202203Изменено в версии 3.2: Ранее было недопустимо удалять имя из локального пространства имён, если оно является свободной переменной во вложенном блоке.204205## 7.6. Инструкция [`return`](https://python-all.ru/3.3/reference/simple_stmts.html#return)206207```208209return_stmt ::=  "return" [expression_list]210```211212[`return`](https://python-all.ru/3.3/reference/simple_stmts.html#return) может синтаксически встречаться только внутри определения функции, а не внутри вложенного определения класса.213214Если список выражений присутствует, он вычисляется, иначе подставляется `None`.215216[`return`](https://python-all.ru/3.3/reference/simple_stmts.html#return) завершает текущий вызов функции, возвращая список выражений (или `None`) в качестве возвращаемого значения.217218Когда [`return`](https://python-all.ru/3.3/reference/simple_stmts.html#return) передаёт управление из инструкции [`try`](https://python-all.ru/3.3/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) выполняется перед тем, как функция действительно завершится.219220В генераторной функции инструкция [`return`](https://python-all.ru/3.3/reference/simple_stmts.html#return) указывает, что генератор завершён, и вызывает [`StopIteration`](https://python-all.ru/3.3/library/exceptions.html#StopIteration). Возвращаемое значение (если есть) используется как аргумент для создания [`StopIteration`](https://python-all.ru/3.3/library/exceptions.html#StopIteration) и становится атрибутом `StopIteration.value`.221222## 7.7. Инструкция [`yield`](https://python-all.ru/3.3/reference/simple_stmts.html#yield)223224```225226yield_stmt ::=  yield_expression227```228229Инструкция [`yield`](https://python-all.ru/3.3/reference/simple_stmts.html#yield) семантически эквивалентна [*выражению yield*](https://python-all.ru/3.3/reference/expressions.html#yieldexpr). Инструкцию yield можно использовать, чтобы опустить скобки, которые иначе потребовались бы в эквивалентном выражении yield. Например, инструкции yield230231```python232yield <expr>233yield from <expr>234```235236эквивалентны выражениям-операторам yield.237238```python239(yield <expr>)240(yield from <expr>)241```242243Yield-выражения и инструкции используются только при определении [*функции-генератора*](https://python-all.ru/3.3/glossary.html#term-generator) и только в теле этой функции. Использования yield в определении функции достаточно, чтобы это определение создавало функцию-генератор вместо обычной функции.244245Подробные сведения о семантике [`yield`](https://python-all.ru/3.3/reference/simple_stmts.html#yield) см. в разделе [*Выражения yield*](https://python-all.ru/3.3/reference/expressions.html#yieldexpr).246247## 7.8. Инструкция [`raise`](https://python-all.ru/3.3/reference/simple_stmts.html#raise)248249```250251raise_stmt ::=  "raise" [expression ["from" expression]]252```253254Если выражения отсутствуют, [`raise`](https://python-all.ru/3.3/reference/simple_stmts.html#raise) повторно возбуждает последнее исключение, которое было активно в текущей области видимости. Если в текущей области нет активного исключения, возбуждается исключение [`RuntimeError`](https://python-all.ru/3.3/library/exceptions.html#RuntimeError), указывающее на ошибку.255256В противном случае [`raise`](https://python-all.ru/3.3/reference/simple_stmts.html#raise) вычисляет первое выражение как объект исключения. Оно должно быть подклассом или экземпляром [`BaseException`](https://python-all.ru/3.3/library/exceptions.html#BaseException). Если это класс, экземпляр исключения будет получен при необходимости путём инстанцирования класса без аргументов.257258*Типом* исключения является класс экземпляра исключения, *значением* – сам экземпляр.259260Объект traceback обычно создаётся автоматически при возбуждении исключения и прикрепляется к нему как атрибут `__traceback__`, который доступен для записи. Можно создать исключение и установить свой собственный traceback за один шаг с помощью метода исключения `with_traceback()` (который возвращает тот же экземпляр исключения, установив его traceback равным аргументу), например:261262```python263raise Exception("foo occurred").with_traceback(tracebackobj)264```265266Предложение `from` используется для связывания исключений: если оно указано, второе *выражение* должно быть другим классом или экземпляром исключения, которое затем будет прикреплено к возбуждённому исключению как атрибут `__cause__` (доступный для записи). Если возбуждённое исключение не перехвачено, оба исключения будут выведены:267268```python269>>> try:270...     print(1 / 0)271... except Exception as exc:272...     raise RuntimeError("Something bad happened") from exc273...274Traceback (most recent call last):275  File "<stdin>", line 2, in <module>276ZeroDivisionError: int division or modulo by zero277278The above exception was the direct cause of the following exception:279280Traceback (most recent call last):281  File "<stdin>", line 4, in <module>282RuntimeError: Something bad happened283```284285Аналогичный механизм работает неявно, если исключение возбуждено внутри обработчика исключений: предыдущее исключение затем присоединяется как атрибут `__context__` нового исключения:286287```python288>>> try:289...     print(1 / 0)290... except:291...     raise RuntimeError("Something bad happened")292...293Traceback (most recent call last):294  File "<stdin>", line 2, in <module>295ZeroDivisionError: int division or modulo by zero296297During handling of the above exception, another exception occurred:298299Traceback (most recent call last):300  File "<stdin>", line 4, in <module>301RuntimeError: Something bad happened302```303304Дополнительную информацию об исключениях можно найти в разделе [*Исключения*](https://python-all.ru/3.3/reference/executionmodel.html#exceptions), а информацию об обработке исключений – в разделе [*Оператор try*](https://python-all.ru/3.3/reference/compound_stmts.html#try).305306## 7.9. Инструкция [`break`](https://python-all.ru/3.3/reference/simple_stmts.html#break)307308```309310break_stmt ::=  "break"311```312313[`break`](https://python-all.ru/3.3/reference/simple_stmts.html#break) может находиться только синтаксически вложенным в цикл [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.3/reference/compound_stmts.html#while), но не внутри определения функции или класса внутри этого цикла.314315Он завершает ближайший охватывающий цикл, пропуская необязательное предложение [`else`](https://python-all.ru/3.3/reference/compound_stmts.html#else), если у цикла оно есть.316317Если цикл [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) прерывается [`break`](https://python-all.ru/3.3/reference/simple_stmts.html#break), целевая переменная цикла сохраняет своё текущее значение.318319Когда [`break`](https://python-all.ru/3.3/reference/simple_stmts.html#break) передаёт управление из инструкции [`try`](https://python-all.ru/3.3/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) выполняется перед тем, как действительно выйти из цикла.320321## 7.10. Инструкция [`continue`](https://python-all.ru/3.3/reference/simple_stmts.html#continue)322323```324325continue_stmt ::=  "continue"326```327328[`continue`](https://python-all.ru/3.3/reference/simple_stmts.html#continue) может находиться только синтаксически вложенным в цикл [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.3/reference/compound_stmts.html#while), но не внутри определения функции или класса, а также не внутри блока [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) внутри этого цикла. Он переходит к следующей итерации ближайшего охватывающего цикла.329330Когда [`continue`](https://python-all.ru/3.3/reference/simple_stmts.html#continue) передаёт управление из инструкции [`try`](https://python-all.ru/3.3/reference/compound_stmts.html#try) с блоком [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally), этот блок [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) выполняется перед началом следующей итерации цикла.331332## 7.11. Инструкция [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import)333334```335336import_stmt     ::=  "import" module ["as" name] ( "," module ["as" name] )*337                     | "from" relative_module "import" identifier ["as" name]338                     ( "," identifier ["as" name] )*339                     | "from" relative_module "import" "(" identifier ["as" name]340                     ( "," identifier ["as" name] )* [","] ")"341                     | "from" module "import" "*"342module          ::=  (identifier ".")* identifier343relative_module ::=  "."* module | "."+344name            ::=  identifier345```346347Базовая инструкция import (без предложения [`from`](https://python-all.ru/3.3/reference/simple_stmts.html#from)) выполняется в два шага:3483491. найти модуль, загрузив и проинициализировав его при необходимости3502. определить имя или имена в локальном пространстве имён для области видимости, в которой встречается инструкция [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import).351352Когда инструкция содержит несколько предложений (разделённых запятыми), два шага выполняются отдельно для каждого предложения, как если бы предложения были разделены на отдельные инструкции import.353354Подробности первого шага, поиск и загрузка модулей, описаны в разделе [*import system*](https://python-all.ru/3.3/reference/import.html#importsystem), который также описывает различные типы пакетов и модулей, которые можно импортировать, а также все хуки, которые можно использовать для настройки системы импорта. Обратите внимание, что сбои на этом шаге могут указывать либо на то, что модуль не удалось найти, *либо* на то, что произошла ошибка при инициализации модуля, включая выполнение кода модуля.355356Если запрошенный модуль успешно получен, он становится доступным в локальном пространстве имен одним из трёх способов:357358- Если за именем модуля следует [`as`](https://python-all.ru/3.3/reference/compound_stmts.html#as), то имя после [`as`](https://python-all.ru/3.3/reference/compound_stmts.html#as) связывается непосредственно с импортированным модулем.359- Если не указано другое имя и импортируемый модуль является модулем верхнего уровня, имя модуля привязывается в локальном пространстве имен как ссылка на импортированный модуль.360- Если импортируемый модуль *не* является модулем верхнего уровня, то имя пакета верхнего уровня, содержащего этот модуль, привязывается в локальном пространстве имен как ссылка на пакет верхнего уровня. Импортированный модуль должен быть доступен по его полному квалифицированному имени, а не напрямую.361362Форма [`from`](https://python-all.ru/3.3/reference/simple_stmts.html#from) использует несколько более сложный процесс:3633641. найти модуль, указанный в предложении [`from`](https://python-all.ru/3.3/reference/simple_stmts.html#from), загрузить и инициализировать его, если необходимо;3652. для каждого из идентификаторов, указанных в предложениях [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import):366367   1. проверить, имеет ли импортированный модуль атрибут с таким именем368   2. если нет, попытаться импортировать подмодуль с таким именем, а затем снова проверить импортированный модуль на наличие этого атрибута369   3. если атрибут не найден, возбуждается [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError).370   4. в противном случае ссылка на это значение связывается в локальном пространстве имён, используя имя из предложения [`as`](https://python-all.ru/3.3/reference/compound_stmts.html#as), если оно присутствует, иначе используя имя атрибута371372Примеры:373374```python375import foo                 # foo импортирован и привязан локально376import foo.bar.baz         # foo.bar.baz импортирован, foo привязан локально377import foo.bar.baz as fbb  # foo.bar.baz импортирован и привязан как fbb378from foo.bar import baz    # foo.bar.baz импортирован и привязан как baz379from foo import attr       # foo импортирован и foo.attr привязан как attr380```381382Если список идентификаторов заменён звёздочкой (`'*'`), все публичные имена, определённые в модуле, связываются в локальном пространстве имён для области видимости, в которой встречается инструкция [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import).383384*Публичные имена*, определённые модулем, определяются путём проверки пространства имён модуля на наличие переменной с именем `__all__`; если она определена, то должна быть последовательностью строк, которые являются именами, определёнными или импортированными этим модулем. Имена, указанные в `__all__`, считаются публичными и должны существовать. Если `__all__` не определена, набор публичных имён включает все имена, найденные в пространстве имён модуля, которые не начинаются с символа подчёркивания (`'_'`). `__all__` должна содержать весь публичный API. Она предназначена для предотвращения случайного экспорта элементов, не являющихся частью API (таких как библиотечные модули, которые были импортированы и использованы внутри модуля).385386Форма [`from`](https://python-all.ru/3.3/reference/simple_stmts.html#from) с `*` может встречаться только в области видимости модуля. Форма импорта с подстановочным знаком – `import *` – разрешена только на уровне модуля. Попытка использовать её в определениях класса или функции вызовет [`SyntaxError`](https://python-all.ru/3.3/library/exceptions.html#SyntaxError).387388Указывая, какой модуль импортировать, не обязательно задавать абсолютное имя модуля. Если модуль или пакет находится внутри другого пакета, можно сделать относительный импорт в пределах того же самого верхнего пакета, не указывая имя пакета. Используя ведущие точки в имени модуля или пакета после [`from`](https://python-all.ru/3.3/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.3/reference/simple_stmts.html).389390[`importlib.import_module()`](https://python-all.ru/3.3/library/importlib.html#importlib.import_module) предоставляется для поддержки приложений, которые determine which modules need to be loaded dynamically.391392### 7.11.1. Инструкции future393394*future statement* – это директива компилятору, указывающая, что конкретный модуль должен быть скомпилирован с использованием синтаксиса или семантики, которые будут доступны в определённом будущем выпуске Python. Инструкция future предназначена для облегчения перехода на будущие версии Python, вносящие несовместимые изменения в язык. Она позволяет использовать новые возможности на уровне отдельных модулей до выхода версии, в которой эта возможность станет стандартной.395396```397398future_statement ::=  "from" "__future__" "import" feature ["as" name]399                      ("," feature ["as" name])*400                      | "from" "__future__" "import" "(" feature ["as" name]401                      ("," feature ["as" name])* [","] ")"402feature          ::=  identifier403name             ::=  identifier404```405406Инструкция future должна располагаться в начале модуля. До инструкции future могут находиться только:407408- строка документации модуля (если есть),409- комментарии,410- пустые строки и411- другие инструкции future.412413Возможности, распознаваемые Python 3.0: `absolute_import`, `division`, `generators`, `unicode_literals`, `print_function`, `nested_scopes` и `with_statement`. Все они избыточны, поскольку всегда включены, и сохранены только для обратной совместимости.414415Инструкция future распознаётся и обрабатывается особым образом на этапе компиляции: изменения семантики ключевых конструкций часто реализуются путём генерации другого кода. Может даже случиться так, что новая возможность вводит новый несовместимый синтаксис (например, новое зарезервированное слово), и тогда компилятору может потребоваться разбирать модуль иначе. Такие решения нельзя откладывать до выполнения.416417Для любого конкретного выпуска компилятор знает, какие имена возможностей определены, и выдаёт ошибку на этапе компиляции, если инструкция future содержит неизвестную ему возможность.418419Непосредственная семантика выполнения та же, что и для любого оператора import: существует стандартный модуль [`__future__`](https://python-all.ru/3.3/library/__future__.html#module-__future__), описанный далее, и он будет импортирован обычным образом в момент выполнения future-оператора.420421Интересная семантика времени выполнения зависит от конкретной возможности, включаемой инструкцией future.422423Обратите внимание, что в этой инструкции нет ничего особенного:424425```python426import __future__ [as name]427```428429Это не инструкция future, а обычная инструкция import без особой семантики или синтаксических ограничений.430431Код, скомпилированный вызовами встроенных функций [`exec()`](https://python-all.ru/3.3/library/functions.html#exec) и [`compile()`](https://python-all.ru/3.3/library/functions.html#compile), которые встречаются в модуле `M`, содержащем future-оператор, по умолчанию будет использовать новый синтаксис или семантику, связанную с этим future-оператором. Это можно контролировать с помощью необязательных аргументов [`compile()`](https://python-all.ru/3.3/library/functions.html#compile) – подробнее см. документацию этой функции.432433Future-оператор, введённый в интерактивном режиме интерпретатора, вступит в силу на оставшуюся часть сеанса интерпретатора. Если интерпретатор запущен с флагом [*-i*](https://python-all.ru/3.3/using/cmdline.html#cmdoption-i), ему передано имя скрипта для выполнения, и скрипт содержит future-оператор, то этот оператор будет действовать в интерактивном сеансе, запущенном после выполнения скрипта.434435> **См. также**436>437> **[**PEP 236**](https://python-all.ru/3.3/reference/simple_stmts.html) – Назад в \_\_future\_\_**438>439> Оригинальное предложение механизма \_\_future\_\_.440441## 7.12. Оператор [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global)442443```444445global_stmt ::=  "global" identifier ("," identifier)*446```447448Оператор [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) – это объявление, действующее на весь текущий блок кода. Оно означает, что перечисленные идентификаторы следует интерпретировать как глобальные. Без [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) было бы невозможно присваивать значения глобальным переменным, хотя свободные переменные могут ссылаться на глобальные, не будучи объявленными глобальными.449450Имена, перечисленные в операторе [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global), не должны использоваться в том же блоке кода текстуально до этого оператора [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global).451452Имена, перечисленные в операторе [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global), не должны быть определены как формальные параметры или как цель управления циклом в [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for), или в определении [`class`](https://python-all.ru/3.3/reference/compound_stmts.html#class), определения функции, или в операторе [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import).453454**CPython implementation detail:** Текущая реализация не применяет последние два ограничения, но программы не должны злоупотреблять этой свободой, поскольку будущие реализации могут начать их применять или незаметно изменить смысл программы.455456**Замечание для программистов:** [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) – это директива для парсера. Она применяется только к коду, который анализируется одновременно с оператором [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global). В частности, оператор [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global), содержащийся в строке или объекте кода, переданном встроенной функции [`exec()`](https://python-all.ru/3.3/library/functions.html#exec), не влияет на блок кода, *содержащий* вызов функции, и код, содержащийся в такой строке, не подвержен влиянию операторов [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) в коде, содержащем вызов функции. То же самое касается функций [`eval()`](https://python-all.ru/3.3/library/functions.html#eval) и [`compile()`](https://python-all.ru/3.3/library/functions.html#compile).457458## 7.13. Оператор [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal)459460```461462nonlocal_stmt ::=  "nonlocal" identifier ("," identifier)*463```464465Инструкция [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal) заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшей объемлющей области видимости. Это важно, потому что поведение по умолчанию для связывания заключается в поиске сначала в локальном пространстве имён. Инструкция позволяет инкапсулированному коду переназначать переменные за пределами локальной области видимости, помимо глобальной (модульной) области.466467Имена, перечисленные в инструкции [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal), в отличие от имён, перечисленных в инструкции [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global), должны ссылаться на уже существующие связывания в объемлющей области видимости (область, в которой должно быть создано новое связывание, не может быть однозначно определена).468469Имена, перечисленные в операторе [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal), не должны конфликтовать с уже существующими привязками в локальной области.470471> **См. также**472>473> **[**PEP 3104**](https://python-all.ru/3.3/reference/simple_stmts.html) – доступ к именам во внешних областях видимости**474>475> Спецификация оператора476>477> [`nonlocal`](https://python-all.ru/3.3/reference/simple_stmts.html#nonlocal)478>479> .480