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

lexical_analysis.md

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

1> **Источник:** https://python-all.ru/3.13/reference/lexical_analysis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 2. Лексический анализ89Программа на Python читается *анализатором*. На вход анализатору подаётся поток [токенов](https://python-all.ru/3.13/glossary.html#term-token), создаваемый *лексическим анализатором* (также называемым *токенизатором*). В этой главе описывается, как лексический анализатор разбивает файл на токены.1011Python читает текст программы как кодовые точки Unicode; кодировка исходного файла может быть задана объявлением кодировки; по умолчанию используется UTF-8, см. [**PEP 3120**](https://python-all.ru/3.13/reference/lexical_analysis.html) для подробностей. Если исходный файл не удаётся декодировать, возбуждается [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError).1213## 2.1. Структура строки1415Программа на Python состоит из нескольких *логических строк*.1617### 2.1.1. Логические строки1819Конец логической строки обозначается токеном NEWLINE. Инструкции не могут пересекать границы логических строк, за исключением случаев, когда NEWLINE допускается синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких *физических строк* путём следования правилам явного или неявного *объединения строк*.2021### 2.1.2. Физические строки2223Физическая строка – это последовательность символов, завершающаяся последовательностью конца строки. В исходных файлах и строках можно использовать любые стандартные для платформы последовательности конца строки: форму Unix с использованием ASCII LF (перевод строки), форму Windows с использованием последовательности ASCII CR LF (возврат каретки и перевод строки) или старую форму Macintosh с символом ASCII CR (возврат каретки). Все эти формы взаимозаменяемы, независимо от платформы. Конец ввода также служит неявным завершителем последней физической строки.2425При встраивании Python исходные строки кода должны передаваться в API Python с использованием стандартных соглашений C для символов новой строки (символ `\n`, представляющий ASCII LF, является терминатором строки).2627### 2.1.3. Комментарии2829Комментарий начинается с символа решётки (`#`), не являющегося частью строкового литерала, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если не применяются правила неявного объединения строк. Комментарии игнорируются синтаксисом.3031### 2.1.4. Объявления кодировки3233Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению `coding[=:]\s*([-\w.]+)`, этот комментарий обрабатывается как объявление кодировки; первая группа этого выражения задаёт кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:3435```python36# -*- coding: <encoding-name> -*-37```3839которая распознаётся также GNU Emacs, и4041```python42# vim:fileencoding=<encoding-name>43```4445которая распознаётся VIM от Брама Муленаара.4647Если объявление кодировки не найдено, используется кодировка UTF-8 по умолчанию. Если неявная или явная кодировка файла – UTF-8, начальная метка порядка байтов UTF-8 (`b'\xef\xbb\xbf'`) игнорируется, а не считается синтаксической ошибкой.4849Если кодировка объявлена, её имя должно распознаваться Python (см. [Стандартные кодировки](https://python-all.ru/3.13/library/codecs.html#standard-encodings)). Кодировка используется для всего лексического анализа, включая строковые литералы, комментарии и идентификаторы.5051### 2.1.5. Явное объединение строк5253Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (`\`) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:5455```python56if 1900 < year < 2100 and 1 <= month <= 12 \57   and 1 <= day <= 31 and 0 <= hour < 24 \58   and 0 <= minute < 60 and 0 <= second < 60:   # Похоже на корректную дату59        return 160```6162Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.6364### 2.1.6. Неявное объединение строк6566Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:6768```python69month_names = ['Januari', 'Februari', 'Maart',      # Это70               'April',   'Mei',      'Juni',       # голландские названия71               'Juli',    'Augustus', 'September',  # для месяцев72               'Oktober', 'November', 'December']   # года73```7475Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.7677### 2.1.7. Пустые строки7879Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т. е. токен NEWLINE не генерируется). Во время интерактивного ввода инструкций обработка пустой строки может различаться в зависимости от реализации цикла чтения-вычисления-печати. В стандартном интерактивном интерпретаторе полностью пустая логическая строка (т. е. не содержащая даже пробельных символов или комментария) завершает многострочную инструкцию.8081### 2.1.8. Отступы8283Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.8485Символы табуляции заменяются (слева направо) на от одного до восьми пробелов так, чтобы общее количество символов до и включая замену было кратно восьми (это то же правило, что используется в Unix). Общее количество пробелов перед первым непробельным символом затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк с помощью обратной косой черты; пробельные символы до первой обратной косой черты определяют отступ.8687Отступ считается недопустимым, если исходный файл смешивает табуляции и пробелы таким образом, что смысл зависит от того, какому количеству пробелов равна табуляция; в этом случае возбуждается [`TabError`](https://python-all.ru/3.13/library/exceptions.html#TabError).8889**Примечание о кроссплатформенной совместимости:** из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.9091Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).9293Уровни отступа последовательных строк используются для генерации токенов INDENT и DEDENT, применяя стек, следующим образом.9495Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At the beginning of each logical line, the line’s indentation level is compared to the top of the stack. If it is equal, nothing happens. If it is larger, it is pushed on the stack, and one INDENT token is generated. If it is smaller, it *must* be one of the numbers occurring on the stack; all numbers on the stack that are larger are popped off, and for each number popped off a DEDENT token is generated. At the end of the file, a DEDENT token is generated for each number remaining on the stack that is larger than zero.9697Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:9899```python100def perm(l):101        # Вычислить список всех перестановок l102    if len(l) <= 1:103                  return [l]104    r = []105    for i in range(len(l)):106             s = l[:i] + l[i+1:]107             p = perm(s)108             for x in p:109              r.append(l[i:i+1] + x)110    return r111```112113Следующий пример показывает различные ошибки отступов:114115```python116 def perm(l):                       # ошибка: первая строка с отступом117for i in range(len(l)):             # ошибка: нет отступа118    s = l[:i] + l[i+1:]119        p = perm(l[:i] + l[i+1:])   # ошибка: неожиданный отступ120        for x in p:121                r.append(l[i:i+1] + x)122            return r                # ошибка: несоответствие отступа123```124125(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка обнаруживается лексическим анализатором – отступ `return r` не соответствует уровню, извлечённому из стека.)126127### 2.1.9. Пробельные символы между токенами128129За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов. Пробел требуется между двумя токенами только в том случае, если их объединение может быть интерпретировано как другой токен (например, ab – один токен, а a b – два токена).130131## 2.2. Прочие токены132133Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist: *identifiers*, *keywords*, *literals*, *operators*, and *delimiters*. Whitespace characters (other than line terminators, discussed earlier) are not tokens, but serve to delimit tokens. Where ambiguity exists, a token comprises the longest possible string that forms a legal token, when read from left to right.134135## 2.3. Identifiers and keywords136137Identifiers (also referred to as *names*) are described by the following lexical definitions.138139The syntax of identifiers in Python is based on the Unicode standard annex UAX-31, with elaboration and changes as defined below; see also [**PEP 3131**](https://python-all.ru/3.13/reference/lexical_analysis.html) for further details.140141Within the ASCII range (U+0001..U+007F), the valid characters for identifiers include the uppercase and lowercase letters `A` through `Z`, the underscore `_` and, except for the first character, the digits `0` through `9`. Python 3.0 introduced additional characters from outside the ASCII range (see [**PEP 3131**](https://python-all.ru/3.13/reference/lexical_analysis.html)). For these characters, the classification uses the version of the Unicode Character Database as included in the [`unicodedata`](https://python-all.ru/3.13/library/unicodedata.html#module-unicodedata) module.142143Идентификаторы не имеют ограничения по длине. Регистр имеет значение.144145```146147identifier   ::= xid_start xid_continue*148id_start     ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>149id_continue  ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>150xid_start    ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">151xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">152```153154Упомянутые выше коды категорий Unicode означают:155156- *Lu* - uppercase letters157- *Ll* - lowercase letters158- *Lt* - titlecase letters159- *Lm* - modifier letters160- *Lo* - other letters161- *Nl* - letter numbers162- *Mn* - nonspacing marks163- *Mc* - spacing combining marks164- *Nd* - decimal numbers165- *Pc* - connector punctuations166- *Other\_ID\_Start* - explicit list of characters in [PropList.txt](https://python-all.ru/3.13/reference/lexical_analysis.html) to support backwards compatibility167- *Other\_ID\_Continue* - likewise168169Все идентификаторы при разборе преобразуются в нормальную форму NFKC; сравнение идентификаторов основано на NFKC.170171A non-normative HTML file listing all valid identifier characters for Unicode 15.1.0 can be found at [https://www.unicode.org/Public/15.1.0/ucd/DerivedCoreProperties.txt](https://python-all.ru/3.13/reference/lexical_analysis.html)172173### 2.3.1. Ключевые слова174175The following identifiers are used as reserved words, or *keywords* of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:176177```text178False      await      else       import     pass179None       break      except     in         raise180True       class      finally    is         return181and        continue   for        lambda     try182as         def        from       nonlocal   while183assert     del        global     not        with184async      elif       if         or         yield185```186187### 2.3.2. Мягкие ключевые слова188189Добавлено в версии 3.10.190191Некоторые идентификаторы зарезервированы только в определённых контекстах. Они называются *мягкими ключевыми словами*. Идентификаторы `match`, `case`, `type` и `_` могут синтаксически выступать как ключевые слова в некоторых контекстах, но такое различие проводится на уровне синтаксического анализатора, а не при токенизации.192193Будучи мягкими ключевыми словами, их использование в грамматике возможно, при этом сохраняется совместимость с существующим кодом, который использует эти имена как имена идентификаторов.194195`match`, `case` и `_` используются в инструкции [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match). `type` используется в инструкции [`type`](https://python-all.ru/3.13/reference/simple_stmts.html#type).196197Изменено в версии 3.12: `type` теперь является мягким ключевым словом.198199### 2.3.3. Зарезервированные классы идентификаторов200201Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:202203**`_*`**204205Не импортируется инструкцией `from module import *`.206207**`_`**208209В шаблоне `case` внутри инструкции [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match) `_` является [мягким ключевым словом](https://python-all.ru/3.13/reference/lexical_analysis.html#soft-keywords), которое обозначает [шаблонный символ (wildcard)](https://python-all.ru/3.13/reference/compound_stmts.html#wildcard-patterns).210211Отдельно, интерактивный интерпретатор делает результат последнего вычисления доступным в переменной `_`. (Он хранится в модуле [`builtins`](https://python-all.ru/3.13/library/builtins.html#module-builtins) вместе со встроенными функциями, такими как `print`.)212213В других контекстах `_` – это обычный идентификатор. Его часто используют для именования «особых» элементов, но для самого Python он не является специальным.214215> **Примечание**216>217> Имя `_` часто используется в связи с интернационализацией; обратитесь к документации модуля [`gettext`](https://python-all.ru/3.13/library/gettext.html#module-gettext) для получения дополнительной информации об этом соглашении.218>219> Оно также часто используется для неиспользуемых переменных.220221**`__*__`**222223Системные имена, неформально известные как «dunder»-имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе [Специальные имена методов](https://python-all.ru/3.13/reference/datamodel.html#specialnames) и в других местах. Вероятно, в будущих версиях Python будут определены новые. *Любое* использование `__*__` имён, в любом контексте, не соответствующее явно документированному использованию, может быть нарушено без предупреждения.224225**`__*`**226227Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел [Идентификаторы (имена)](https://python-all.ru/3.13/reference/expressions.html#atom-identifiers).228229## 2.4. Литералы230231Литералы – это обозначения константных значений некоторых встроенных типов.232233### 2.4.1. Строковые литералы и литералы байтов234235Строковые литералы описываются следующими лексическими определениями:236237```238239stringliteral   ::= [stringprefix](shortstring | longstring)240stringprefix    ::= "r" | "u" | "R" | "U" | "f" | "F"241                    | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"242shortstring     ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'243longstring      ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'244shortstringitem ::= shortstringchar | stringescapeseq245longstringitem  ::= longstringchar | stringescapeseq246shortstringchar ::= <any source character except "\" or newline or the quote>247longstringchar  ::= <any source character except "\">248stringescapeseq ::= "\" <any source character>249```250251```252253bytesliteral   ::= bytesprefix(shortbytes | longbytes)254bytesprefix    ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"255shortbytes     ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'256longbytes      ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'257shortbytesitem ::= shortbyteschar | bytesescapeseq258longbytesitem  ::= longbyteschar | bytesescapeseq259shortbyteschar ::= <any ASCII character except "\" or newline or the quote>260longbyteschar  ::= <any ASCII character except "\">261bytesescapeseq ::= "\" <any ASCII character>262```263264Одно синтаксическое ограничение, не указанное в этих продукциях, заключается в том, что пробелы не допускаются между [`stringprefix`](https://python-all.ru/3.13/reference/lexical_analysis.html#grammar-token-python-grammar-stringprefix) или [`bytesprefix`](https://python-all.ru/3.13/reference/lexical_analysis.html#grammar-token-python-grammar-bytesprefix) и остальной частью литерала. Исходный набор символов определяется объявлением кодировки; если в исходном файле нет объявления кодировки, используется UTF-8; см. раздел [Объявления кодировок](https://python-all.ru/3.13/reference/lexical_analysis.html#encodings).265266Простыми словами: оба типа литералов могут быть заключены в совпадающие одинарные кавычки (`'`) или двойные кавычки (`"`). Их также можно заключать в совпадающие группы из трёх одинарных или двойных кавычек (обычно их называют *строками в тройных кавычках*). Обратная косая черта (`\`) используется для придания особого значения обычным символам, таким как `n`, который при экранировании означает «новая строка» (`\n`). Её также можно использовать для экранирования символов, которые в противном случае имеют особое значение, например, новой строки, самой обратной косой черты или символа кавычки. Примеры см. в [управляющих последовательностях](https://python-all.ru/3.13/reference/lexical_analysis.html#escape-sequences) ниже.267268Литералы байтов всегда имеют префикс `'b'` или `'B'`; они создают экземпляр типа [`bytes`](https://python-all.ru/3.13/library/stdtypes.html#bytes) вместо типа [`str`](https://python-all.ru/3.13/library/stdtypes.html#str). Они могут содержать только символы ASCII; байты с числовым значением 128 или больше должны быть представлены с помощью управляющих последовательностей.269270Как строковые литералы, так и литералы байтов могут по желанию иметь префикс с буквой `'r'` или `'R'`; такие конструкции называются соответственно *сырыми строковыми литералами* и *сырыми литералами байтов* и обрабатывают обратные косые черты как буквальные символы. В результате в сырых строковых литералах управляющие последовательности `'\U'` и `'\u'` не обрабатываются особым образом.271272Добавлено в версии 3.3: Префикс `'rb'` для сырых байтовых литералов был добавлен как синоним `'br'`.273274Поддержка устаревшего литерала Unicode (`u'value'`) была восстановлена, чтобы упростить поддержку кодовых баз, работающих одновременно на Python 2.x и 3.x. Подробнее см. [**PEP 414**](https://python-all.ru/3.13/reference/lexical_analysis.html).275276Строковый литерал с `'f'` или `'F'` в префиксе является *форматированным строковым литералом*; см. [f-строки](https://python-all.ru/3.13/reference/lexical_analysis.html#f-strings). `'f'` может сочетаться с `'r'`, но не с `'b'` или `'u'`, поэтому возможны сырые форматированные строки, но не форматированные литералы байтов.277278В литералах в тройных кавычках разрешены неэкранированные символы новой строки и кавычки (и они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают литерал. («Кавычка» – это символ, используемый для открытия литерала, т.е. либо `'`, либо `"`.)279280#### 2.4.1.1. Escape-последовательности281282Если префикс `'r'` или `'R'` отсутствует, управляющие последовательности в строковых и байтовых литералах интерпретируются по правилам, аналогичным используемым в стандарте C. Распознаваемые управляющие последовательности:283284| Escape-последовательность | Значение | Примечания |285| --- | --- | --- |286| `\`\<новая строка\> | Обратная косая черта и новая строка игнорируются | (1) |287| `\\` | Обратная косая черта (`\`) |  |288| `\'` | Одинарная кавычка (`'`) |  |289| `\"` | Двойная кавычка (`"`) |  |290| `\a` | ASCII Звонок (BEL) |  |291| `\b` | ASCII Забой (BS) |  |292| `\f` | ASCII Перевод страницы (FF) |  |293| `\n` | ASCII Перевод строки (LF) |  |294| `\r` | ASCII Возврат каретки (CR) |  |295| `\t` | ASCII горизонтальная табуляция (TAB) |  |296| `\v` | ASCII вертикальная табуляция (VT) |  |297| `\ooo` | Символ с восьмеричным значением *ooo* | (2,4) |298| `\xhh` | Символ с шестнадцатеричным значением *hh* | (3,4) |299300Управляющие последовательности, распознаваемые только в строковых литералах:301302| Escape-последовательность | Значение | Примечания |303| --- | --- | --- |304| `\N{name}` | Символ с именем *name* в базе данных Unicode | (5) |305| `\uxxxx` | Символ с 16-битным шестнадцатеричным значением *xxxx* | (6) |306| `\Uxxxxxxxx` | Символ с 32-битным шестнадцатеричным значением *xxxxxxxx* | (7) |307308Примечания:3093101. Обратную косую черту можно добавить в конце строки, чтобы игнорировать символ новой строки:311312   ```python313   >>> 'This string will not include \314   ... backslashes or newline characters.'315   'This string will not include backslashes or newline characters.'316   ```317318   Того же результата можно достичь с помощью [строк в тройных кавычках](https://python-all.ru/3.13/reference/lexical_analysis.html#strings), или круглых скобок и [конкатенации строковых литералов](https://python-all.ru/3.13/reference/lexical_analysis.html#string-concatenation).3192. Как и в стандарте C, допускается до трёх восьмеричных цифр.320321   Изменено в версии 3.11: Восьмеричные управляющие последовательности со значением больше `0o377` вызывают [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning).322323   Изменено в версии 3.12: Восьмеричные управляющие последовательности со значением больше `0o377` вызывают [`SyntaxWarning`](https://python-all.ru/3.13/library/exceptions.html#SyntaxWarning). В одной из будущих версий Python они будут окончательно превращены в [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError).3243. В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.3254. В байтовом литерале шестнадцатеричные и восьмеричные управляющие последовательности обозначают байт с заданным значением. В строковом литерале эти управляющие последовательности обозначают символ Unicode с заданным значением.3265. Изменено в версии 3.3: Добавлена поддержка псевдонимов имён [\[1\]](https://python-all.ru/3.13/reference/lexical_analysis.html#id16).3276. Требуется ровно четыре шестнадцатеричные цифры.3287. Любой символ Unicode может быть закодирован таким образом. Требуется ровно восемь шестнадцатеричных цифр.329330В отличие от стандарта C, все нераспознанные управляющие последовательности остаются в строке без изменений, т.е. *обратная косая черта сохраняется в результате*. (Это поведение полезно при отладке: если управляющая последовательность введена с ошибкой, полученный результат легче распознать как сломанный.) Также важно отметить, что управляющие последовательности, распознаваемые только в строковых литералах, попадают в категорию нераспознанных управляющих последовательностей для байтовых литералов.331332Изменено в версии 3.6: Нераспознанные escape-последовательности приводят к появлению [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning).333334Изменено в версии 3.12: Нераспознанные управляющие последовательности вызывают [`SyntaxWarning`](https://python-all.ru/3.13/library/exceptions.html#SyntaxWarning). В одной из будущих версий Python они будут окончательно превращены в [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError).335336Даже в сыром литерале кавычки можно экранировать обратной косой чертой, но обратная косая черта остаётся в результате; например, `r"\""` – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; `r"\"` – это недопустимый строковый литерал (даже сырая строка не может заканчиваться нечётным количеством обратных косых черт). В частности, *сырой литерал не может заканчиваться одной обратной косой чертой* (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе литерала, *а не* как продолжение строки.337338### 2.4.2. Конкатенация строковых литералов339340Допускается несколько расположенных рядом строковых или байтовых литералов (разделённых пробелами), возможно, с использованием разных соглашений о кавычках, и их значение совпадает со значением их конкатенации. Таким образом, `"hello" 'world'` эквивалентно `"helloworld"`. Эта возможность может использоваться для уменьшения количества необходимых обратных косых черт, для удобного разбиения длинных строк на несколько строк или даже для добавления комментариев к частям строк, например:341342```python343re.compile("[A-Za-z_]"       # буква или подчёркивание344           "[A-Za-z0-9_]*"   # буква, цифра или подчёркивание345          )346```347348Обратите внимание, что эта возможность определена на синтаксическом уровне, но реализуется на этапе компиляции. Оператор '+' необходимо использовать для конкатенации строковых выражений во время выполнения. Также обратите внимание, что литеральная конкатенация может использовать разные стили кавычек для каждого компонента (даже смешивая сырые строки и строки в тройных кавычках), а форматированные строковые литералы могут конкатенироваться с обычными строковыми литералами.349350### 2.4.3. f-строки351352Добавлено в версии 3.6.353354*Форматированный строковый литерал* или *f-строка* – это строковый литерал, имеющий префикс `'f'` или `'F'`. Такие строки могут содержать поля подстановки – выражения, ограниченные фигурными скобками `{}`. В то время как другие строковые литералы всегда имеют постоянное значение, форматированные строки на самом деле являются выражениями, вычисляемыми во время выполнения.355356Управляющие последовательности декодируются так же, как в обычных строковых литералах (за исключением случаев, когда литерал также помечен как сырая строка). После декодирования грамматика содержимого строки выглядит следующим образом:357358```359360f_string          ::= (literal_char | "{{" | "}}" | replacement_field)*361replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"362f_expression      ::= (conditional_expression | "*" or_expr)363                      ("," conditional_expression | "," "*" or_expr)* [","]364                      | yield_expression365conversion        ::= "s" | "r" | "a"366format_spec       ::= (literal_char | replacement_field)*367literal_char      ::= <any code point except "{", "}" or NULL>368```369370Части строки вне фигурных скобок обрабатываются буквально, за исключением того, что любые удвоенные фигурные скобки `'{{'` или `'}}'` заменяются соответствующей одиночной фигурной скобкой. Одиночная открывающая фигурная скобка `'{'` отмечает поле подстановки, которое начинается с выражения Python. Чтобы отобразить как текст выражения, так и его значение после вычисления (полезно при отладке), после выражения может быть добавлен знак равенства `'='`. За ним может следовать поле преобразования, вводимое восклицательным знаком `'!'`. Также может быть добавлен спецификатор формата, вводимый двоеточием `':'`. Поле подстановки заканчивается закрывающей фигурной скобкой `'}'`.371372Выражения в форматированных строковых литералах обрабатываются как обычные выражения Python, заключенные в круглые скобки, за некоторыми исключениями. Пустое выражение не допускается, а [`lambda`](https://python-all.ru/3.13/reference/expressions.html#lambda) и выражения присваивания `:=` должны быть окружены явными круглыми скобками. Каждое выражение вычисляется в контексте, где встречается форматированный строковый литерал, слева направо. Выражения подстановки могут содержать символы новой строки как в строках f с одинарными, так и с тройными кавычками, и могут содержать комментарии. Все, что следует за `#` внутри поля подстановки, является комментарием (даже закрывающие скобки и кавычки). В этом случае поля подстановки должны закрываться на другой строке.373374```text375>>> f"abc{a # This is a comment }"376... + 3}"377'abc5'378```379380Изменено в версии 3.7: До Python 3.7 выражение [`await`](https://python-all.ru/3.13/reference/expressions.html#await) и генераторы, содержащие условие [`async for`](https://python-all.ru/3.13/reference/compound_stmts.html#async-for), были недопустимы в выражениях в форматированных строковых литералах из-за проблемы в реализации.381382Изменено в версии 3.12: До Python 3.12 комментарии не допускались внутри полей подстановки f-строк.383384Когда указан знак равенства `'='`, вывод будет содержать текст выражения, `'='` и вычисленное значение. Пробелы после открывающей скобки `'{'`, внутри выражения и после `'='` сохраняются в выводе. По умолчанию `'='` приводит к тому, что [`repr()`](https://python-all.ru/3.13/library/functions.html#repr) выражения предоставляется, если не указан формат. Когда формат указан, по умолчанию используется [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str) выражения, если не объявлено преобразование `'!r'`.385386Добавлено в версии 3.8: Знак равенства `'='`.387388Если указано преобразование, результат вычисления выражения преобразуется перед форматированием. Преобразование `'!s'` вызывает [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str) для результата, `'!r'` вызывает [`repr()`](https://python-all.ru/3.13/library/functions.html#repr), а `'!a'` вызывает [`ascii()`](https://python-all.ru/3.13/library/functions.html#ascii).389390Затем результат форматируется с использованием протокола [`format()`](https://python-all.ru/3.13/library/functions.html#format). Спецификатор формата передается методу [`__format__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__format__) результата выражения или преобразования. Пустая строка передается, если спецификатор формата опущен. Отформатированный результат затем включается в итоговое значение всей строки.391392Спецификаторы формата верхнего уровня могут включать вложенные поля подстановки. Эти вложенные поля могут содержать свои собственные поля преобразования и [спецификаторы формата](https://python-all.ru/3.13/library/string.html#formatspec), но не могут содержать более глубоко вложенные поля подстановки. [Мини-язык спецификатора формата](https://python-all.ru/3.13/library/string.html#formatspec) такой же, как используемый методом [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format).393394Форматированные строковые литералы могут конкатенироваться, но поля подстановки не могут разделяться между литералами.395396Некоторые примеры форматированных строковых литералов:397398```python399>>> name = "Fred"400>>> f"He said his name is {name!r}."401"He said his name is 'Fred'."402>>> f"He said his name is {repr(name)}."  # repr() эквивалентно !r403"He said his name is 'Fred'."404>>> width = 10405>>> precision = 4406>>> value = decimal.Decimal("12.34567")407>>> f"result: {value:{width}.{precision}}"  # вложенные поля408'result:      12.35'409>>> today = datetime(year=2017, month=1, day=27)410>>> f"{today:%B %d, %Y}"  # использование спецификатора формата даты411'January 27, 2017'412>>> f"{today=:%B %d, %Y}" # использование спецификатора формата даты и отладка413'today=January 27, 2017'414>>> number = 1024415>>> f"{number:#0x}"  # использование спецификатора формата целого числа416'0x400'417>>> foo = "bar"418>>> f"{ foo = }" # сохраняет пробельные символы419" foo = 'bar'"420>>> line = "The mill's closed"421>>> f"{line = }"422'line = "The mill\'s closed"'423>>> f"{line = :20}"424"line = The mill's closed   "425>>> f"{line = !r:20}"426'line = "The mill\'s closed" '427```428429Повторное использование типа кавычек внешней f-строки внутри поля подстановки разрешено:430431```python432>>> a = dict(x=2)433>>> f"abc {a["x"]} def"434'abc 2 def'435```436437Изменено в версии 3.12: До Python 3.12 повторное использование того же типа кавычек, что и внешняя f-строка, внутри поля подстановки было невозможно.438439Обратные косые черты также допускаются в полях подстановки и вычисляются так же, как в любом другом контексте:440441```python442>>> a = ["a", "b", "c"]443>>> print(f"List a contains:\n{"\n".join(a)}")444List a contains:445a446b447c448```449450Изменено в версии 3.12: До Python 3.12 обратная косая черта не допускалась внутри поля подстановки f-строки.451452Форматированные строковые литералы нельзя использовать в качестве строк документации, даже если они не содержат выражений.453454```python455>>> def foo():456...     f"Not a docstring"457...458>>> foo.__doc__ is None459True460```461462См. также [**PEP 498**](https://python-all.ru/3.13/reference/lexical_analysis.html), в котором предлагается добавление форматированных строковых литералов, и [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format), в котором используется связанный механизм форматных строк.463464### 2.4.4. Числовые литералы465466Существует три типа числовых литералов: целые числа, числа с плавающей точкой и мнимые числа. Комплексных литералов нет (комплексные числа можно получить сложением действительного и мнимого чисел).467468Обратите внимание, что числовые литералы не включают знак; фраза вида `-1` на самом деле является выражением, состоящим из унарного оператора '`-`' и литерала `1`.469470### 2.4.5. Целочисленные литералы471472Целочисленные литералы описываются следующими лексическими определениями:473474```475476integer      ::= decinteger | bininteger | octinteger | hexinteger477decinteger   ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*478bininteger   ::= "0" ("b" | "B") (["_"] bindigit)+479octinteger   ::= "0" ("o" | "O") (["_"] octdigit)+480hexinteger   ::= "0" ("x" | "X") (["_"] hexdigit)+481nonzerodigit ::= "1"..."9"482digit        ::= "0"..."9"483bindigit     ::= "0" | "1"484octdigit     ::= "0"..."7"485hexdigit     ::= digit | "a"..."f" | "A"..."F"486```487488Не существует ограничения на длину целочисленных литералов, кроме того, что может быть сохранено в доступной памяти.489490Символы подчеркивания игнорируются при определении числового значения литерала. Они могут использоваться для группировки цифр для повышения читаемости. Один символ подчеркивания может стоять между цифрами и после указателей основания, например `0x`.491492Обратите внимание, что ведущие нули в ненулевом десятичном числе не допускаются. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.493494Некоторые примеры целочисленных литералов:495496```python4977     2147483647                        0o177    0b1001101114983     79228162514264337593543950336     0o377    0xdeadbeef499      100_000_000_000                   0b_1110_0101500```501502Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.503504### 2.4.6. Литералы с плавающей точкой505506Литералы с плавающей точкой описываются следующими лексическими определениями:507508```509510floatnumber   ::= pointfloat | exponentfloat511pointfloat    ::= [digitpart] fraction | digitpart "."512exponentfloat ::= (digitpart | pointfloat) exponent513digitpart     ::= digit (["_"] digit)*514fraction      ::= "." digitpart515exponent      ::= ("e" | "E") ["+" | "-"] digitpart516```517518Обратите внимание, что целая часть и показатель степени всегда интерпретируются с основанием 10. Например, `077e010` допустимо и обозначает то же число, что и `77e10`. Допустимый диапазон литералов с плавающей точкой зависит от реализации. Как и в целочисленных литералах, поддерживаются символы подчеркивания для группировки цифр.519520Некоторые примеры литералов с плавающей точкой:521522```python5233.14    10.    .001    1e100    3.14e-10    0e0    3.14_15_93524```525526Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.527528### 2.4.7. Мнимые литералы529530Мнимые литералы описываются следующими лексическими определениями:531532```533534imagnumber ::= (floatnumber | digitpart) ("j" | "J")535```536537Мнимый литерал дает комплексное число с действительной частью 0.0. Комплексные числа представляются в виде пары чисел с плавающей точкой и имеют те же ограничения на диапазон. Чтобы создать комплексное число с ненулевой действительной частью, добавьте к нему число с плавающей точкой, например `(3+4j)`. Некоторые примеры мнимых литералов:538539```python5403.14j   10.j    10j     .001j   1e100j   3.14e-10j   3.14_15_93j541```542543## 2.5. Операторы544545Следующие токены являются операторами:546547```text548+       -       *       **      /       //      %      @549<<      >>      &       |       ^       ~       :=550<       >       <=      >=      ==      !=551```552553## 2.6. Разделители554555Следующие токены служат разделителями в грамматике:556557```text558(       )       [       ]       {       }559,       :       !       .       ;       @       =560->      +=      -=      *=      /=      //=     %=561@=      &=      |=      ^=      >>=     <<=     **=562```563564Точка может также встречаться в литералах с плавающей точкой и мнимых литералах. Последовательность из трех точек имеет особое значение как литерал многоточия. Вторая половина списка – операторы присваивания с дополнением – лексически служат разделителями, но также выполняют операцию.565566Следующие печатные ASCII-символы имеют специальное значение как часть других токенов или иным образом значимы для лексического анализатора:567568```text569'       "       #       \570```571572Следующие печатные ASCII-символы не используются в Python. Их появление вне строковых литералов и комментариев является безусловной ошибкой:573574```text575$       ?       `576```577578Сноски579580\[[1](https://python-all.ru/3.13/reference/lexical_analysis.html#id12)\]581582[https://www.unicode.org/Public/15.1.0/ucd/NameAliases.txt](https://python-all.ru/3.13/reference/lexical_analysis.html)583