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

2. Лексический анализLexical analysis

Программа на Python читается синтаксическим анализатором. На вход синтаксического анализатора подаётся поток токенов, генерируемых лексическим анализатором (также называемым токенизатором). В этой главе описывается, как лексический анализатор создаёт эти токены.

Лексический анализатор определяет кодировку текста программы (по умолчанию UTF-8) и декодирует текст в исходные символы. Если текст не удаётся декодировать, возбуждается исключение SyntaxError.

Затем лексический анализатор использует исходные символы для генерации потока токенов. Тип генерируемого токена обычно зависит от следующего исходного символа, который должен быть обработан. Аналогично, другое специальное поведение анализатора зависит от первого исходного символа, который ещё не был обработан. В следующей таблице приведён краткий обзор этих исходных символов со ссылками на разделы, содержащие дополнительную информацию.

Символ

Следующий токен (или соответствующая документация)

  • пробел

  • табуляция

  • прогон страницы

  • CR, LF

  • обратная косая черта (\)

  • знак решётки (#)

  • кавычка (', ")

  • буква ASCII (a-z, A-Z)

  • не ASCII-символ

  • символ подчёркивания (_)

  • цифра (0-9)

  • точка (.)

  • вопросительный знак (?)

  • доллар ($)

  • обратный апостроф (​`​)

  • управляющий символ

  • Ошибка (вне строковых литералов и комментариев)

  • другой печатный символ

  • конец файла

2.1. Структура строкиLine structure

Программа на Python состоит из нескольких логических строк.

2.1.1. Логические строкиLogical lines

Конец логической строки обозначается токеном NEWLINE. Инструкции не могут пересекать границы логических строк, кроме тех случаев, когда NEWLINE разрешено синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких физических строк по правилам явного или неявного объединения строк.

2.1.2. Физические строкиPhysical lines

Физическая строка – это последовательность символов, завершающаяся одной из следующих последовательностей конца строки:

  • форма Unix, использующая ASCII LF (перевод строки),

  • форма Windows, использующая последовательность ASCII CR LF (возврат каретки, затем перевод строки),

  • форма ‘Classic Mac OS’, использующая символ ASCII CR (возврат каретки).

Независимо от платформы, каждая из этих последовательностей заменяется одним символом ASCII LF (перевод строки). (Это делается даже внутри строковых литералов.) В каждой строке может использоваться любая из этих последовательностей; они не обязаны быть согласованными в пределах одного файла.

Конец входных данных также служит неявным терминатором для последней физической строки.

Формально:

newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR>

2.1.3. КомментарииComments

Комментарий начинается с символа решётки (#), не являющегося частью строкового литерала, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если не применяются правила неявного объединения строк. Комментарии игнорируются синтаксисом.

2.1.4. Объявления кодировкиEncoding declarations

Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению coding[=:]\s*([-\w.]+), этот комментарий обрабатывается как объявление кодировки; первая группа этого выражения задаёт кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:

# -*- coding: <encoding-name> -*-

которая распознаётся также GNU Emacs, и

# vim:fileencoding=<encoding-name>

которая распознаётся VIM от Брама Муленаара.

Если объявление кодировки не найдено, используется кодировка UTF-8 по умолчанию. Если неявная или явная кодировка файла – UTF-8, начальная метка порядка байтов UTF-8 (b'\xef\xbb\xbf') игнорируется, а не считается синтаксической ошибкой.

Если кодировка объявлена, её имя должно распознаваться Python (см. Стандартные кодировки). Кодировка используется для всего лексического анализа, включая строковые литералы, комментарии и идентификаторы.

Весь лексический анализ, включая строковые литералы, комментарии и идентификаторы, работает с текстом Unicode, декодированным с использованием исходной кодировки. Любая кодовая точка Unicode, кроме управляющего символа NUL, может встречаться в исходном коде Python.

source_character:  <any Unicode code point, except NUL>

2.1.5. Явное объединение строкExplicit line joining

Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (\) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Похоже на корректную дату
        return 1

Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.

2.1.6. Неявное объединение строкImplicit line joining

Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:

month_names = ['Januari', 'Februari', 'Maart',      # Это
               'April',   'Mei',      'Juni',       # голландские названия
               'Juli',    'Augustus', 'September',  # для месяцев
               'Oktober', 'November', 'December']   # года

Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.

2.1.7. Пустые строкиBlank lines

Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т.е. токен NEWLINE не генерируется). При интерактивном вводе инструкций обработка пустой строки может отличаться в зависимости от реализации цикла чтения-вычисления-вывода. В стандартном интерактивном интерпретаторе полностью пустая логическая строка (то есть строка, не содержащая даже пробелов или комментария) завершает многострочную инструкцию.

2.1.8. ОтступыIndentation

Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.

Символы табуляции заменяются (слева направо) на от одного до восьми пробелов так, чтобы общее количество символов до и включая замену было кратно восьми (это то же правило, что используется в Unix). Общее количество пробелов перед первым непробельным символом затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк с помощью обратной косой черты; пробельные символы до первой обратной косой черты определяют отступ.

Отступ считается недопустимым, если исходный файл смешивает табуляции и пробелы таким образом, что смысл зависит от того, какому количеству пробелов равна табуляция; в этом случае возбуждается TabError.

Примечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.

Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).

Уровни отступов последовательных строк используются для генерации токенов INDENT и DEDENT с помощью стека следующим образом.

Перед чтением первой строки файла в стек помещается ноль; он никогда не будет извлечён снова. Числа, помещаемые в стек, будут всегда строго возрастать от нижней части к верхней. В начале каждой логической строки её уровень отступа сравнивается с верхушкой стека. Если они равны, ничего не происходит. Если он больше, он помещается в стек, и генерируется один токен INDENT. Если он меньше, он должен быть одним из чисел, уже присутствующих в стеке; все числа в стеке, которые больше, извлекаются, и для каждого извлечённого числа генерируется токен DEDENT. В конце файла генерируется токен DEDENT для каждого числа, оставшегося в стеке и большего нуля.

Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:

def perm(l):
        # Вычислить список всех перестановок l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

Следующий пример показывает различные ошибки отступов:

 def perm(l):                       # ошибка: первая строка с отступом
for i in range(len(l)):             # ошибка: нет отступа
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # ошибка: неожиданный отступ
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # ошибка: несоответствие отступа

(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка обнаруживается лексическим анализатором – отступ return r не соответствует уровню, извлечённому из стека.)

2.1.9. Пробельные символы между токенамиWhitespace between tokens

За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов:

whitespace:  ' ' | tab | formfeed

Пробельные символы нужны между двумя токенами только в том случае, если их слияние может быть интерпретировано как другой токен. Например, ab – один токен, но a b – два токена. Однако +a и + a оба дают два токена, + и a, поскольку +a не является допустимым токеном.

2.1.10. Конечный маркерEnd marker

В конце неинтерактивного ввода лексический анализатор генерирует токен ENDMARKER.

2.2. Прочие токеныOther tokens

Помимо NEWLINE, INDENT и DEDENT, существуют следующие категории токенов: идентификаторы и ключевые слова (NAME), литералы (такие как NUMBER и STRING), а также другие символы (операторы и разделители, OP). Пробельные символы (за исключением терминаторов логических строк, рассмотренных ранее) не являются токенами, а служат для разделения токенов. При неоднозначности токен включает самую длинную возможную строку, образующую допустимый токен при чтении слева направо.

2.3. Имена (идентификаторы и ключевые слова)Names (identifiers and keywords)

Токены NAME представляют идентификаторы, ключевые слова и мягкие ключевые слова.

Имена состоят из следующих символов:

  • прописные и строчные буквы (A-Z и a-z),

  • символ подчёркивания (_),

  • цифры (от 0 до 9), которые не могут быть первым символом, и

  • не-ASCII символы. Допустимые имена могут содержать только «буквоподобные» и «цифроподобные» символы; подробности см. в разделе Не-ASCII символы в именах.

Имена должны содержать хотя бы один символ, но верхнего ограничения длины нет. Регистр имеет значение.

Формально имена описываются следующими лексическими определениями:

NAME:          name_start name_continue*
name_start:    "a"..."z" | "A"..."Z" | "_" | <non-ASCII character>
name_continue: name_start | "0"..."9"
identifier:    <NAME, except keywords>

Обратите внимание, что не все имена, соответствующие этой грамматике, являются допустимыми; подробности см. в разделе Не-ASCII символы в именах.

2.3.1. Ключевые словаKeywords

Следующие имена используются как зарезервированные слова, или ключевые слова языка, и не могут использоваться в качестве обычных идентификаторов. Они должны записываться в точности так, как указано ниже:

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

2.3.2. Мягкие ключевые словаSoft Keywords

Добавлено в версии 3.10.

Некоторые имена зарезервированы только в определённых контекстах. Они называются мягкими ключевыми словами:

  • match, case и _ при использовании в инструкции match.

  • type при использовании в инструкции type.

  • lazy, если используется перед инструкцией import.

Синтаксически они ведут себя как ключевые слова в своих контекстах, но это различие проводится на уровне синтаксического анализатора, а не при токенизации.

Будучи мягкими ключевыми словами, их использование в грамматике возможно, при этом сохраняется совместимость с существующим кодом, который использует эти имена как имена идентификаторов.

Изменено в версии 3.12: type теперь является мягким ключевым словом.

Изменено в версии 3.15: lazy теперь является мягким ключевым словом.

2.3.3. Зарезервированные классы идентификаторовReserved classes of identifiers

Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:

_*

Не импортируется инструкцией from module import *.

_

В шаблоне case внутри инструкции match _ является мягким ключевым словом, которое обозначает шаблонный символ (wildcard).

Отдельно, интерактивный интерпретатор делает результат последнего вычисления доступным в переменной _. (Он хранится в модуле builtins вместе со встроенными функциями, такими как print.)

В других контекстах _ – это обычный идентификатор. Его часто используют для именования «особых» элементов, но для самого Python он не является специальным.

Примечание

Имя _ часто используется в связи с интернационализацией; обратитесь к документации модуля gettext для получения дополнительной информации об этом соглашении.

Оно также часто используется для неиспользуемых переменных.

__*__

Системные имена, неформально известные как «dunder»-имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе Специальные имена методов и в других местах. Вероятно, в будущих версиях Python будут определены новые. Любое использование __*__ имён, в любом контексте, не соответствующее явно документированному использованию, может быть нарушено без предупреждения.

__*

Приватные имена классов. Имена этой категории при использовании в контексте определения класса переписываются в искажённую форму, чтобы избежать конфликтов имён между «приватными» атрибутами базовых и производных классов. См. раздел Идентификаторы (имена).

2.3.4. Не-ASCII символы в именахNon-ASCII characters in names

Имена, содержащие не-ASCII символы, требуют дополнительной нормализации и проверки, помимо правил и грамматики, описанных выше. Например, ř_1, или साँप являются допустимыми именами, а r〰2, или 🐍 – нет.

В этом разделе объясняются точные правила.

Все имена при синтаксическом анализе преобразуются в форму нормализации NFKC. Это означает, что, например, некоторые типографские варианты символов преобразуются в свою «базовую» форму. Например, fiⁿₐˡᵢᶻₐᵗᵢᵒₙ нормализуется в finalization, поэтому Python считает их одним и тем же именем:

>>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3
>>> finalization
3

Примечание

Нормализация выполняется только на лексическом уровне. Функции времени выполнения, которые принимают имена в виде строк, обычно не нормализуют свои аргументы. Например, определённая выше переменная доступна во время выполнения в словаре globals() как globals()["finalization"], но не как globals()["fiⁿₐˡᵢᶻₐᵗᵢᵒₙ"].

Аналогично тому, как имена, состоящие только из ASCII, должны содержать только буквы, цифры и символ подчёркивания и не могут начинаться с цифры, допустимое имя должно начинаться с символа из «буквоподобного» набора xid_start, а остальные символы должны быть из «букво- и цифроподобного» набора xid_continue.

Эти наборы основаны на множествах XID_Start и XID_Continue, определённых в приложении к стандарту Unicode UAX-31. Python’s xid_start дополнительно включает символ подчёркивания (_). Обратите внимание, что Python не обязательно соответствует UAX-31.

Неформальный перечень символов из множеств XID_Start и XID_Continue, определённых в стандарте Unicode, доступен в файле DerivedCoreProperties.txt в базе данных символов Unicode. Для справки, правила построения наборов xid_* приведены ниже.

Множество id_start определяется как объединение:

  • Категория Unicode <Lu> – прописные буквы (включает AZ)

  • Категория Unicode <Ll> – строчные буквы (включает az)

  • Категория Unicode <Lt> – буквы заглавного регистра

  • Категория Unicode <Lm> – модифицирующие буквы

  • Категория Unicode <Lo> – прочие буквы

  • Категория Unicode <Nl> – буквенные числа

  • {"_"} – символ подчёркивания

  • <Other_ID_Start> – явный набор символов из PropList.txt для поддержки обратной совместимости

Множество xid_start затем замыкает это множество относительно нормализации NFKC, удаляя все символы, чья нормализация не имеет вида id_start id_continue*.

Множество id_continue определяется как объединение:

  • id_start (см. выше)

  • Категория Unicode <Nd> – десятичные числа (включает 09)

  • Категория Unicode <Pc> – соединительные знаки пунктуации

  • Категория Unicode <Mn> – некомбинируемые знаки

  • Категория Unicode <Mc> – комбинируемые знаки с увеличением ширины

  • <Other_ID_Continue> – ещё один явный набор символов из PropList.txt для поддержки обратной совместимости

Снова xid_continue замыкает это множество относительно нормализации NFKC.

Категории Unicode используют версию базы данных символов Unicode, включённую в модуль unicodedata.

См. также

  • PEP 3131 – Поддержка не-ASCII идентификаторов

  • PEP 672 – Соображения безопасности, связанные с Unicode, для Python

2.4. ЛитералыLiterals

Литералы – это обозначения константных значений некоторых встроенных типов.

С точки зрения лексического анализа, Python имеет string, bytes и numeric литералы.

Другие «литералы» лексически обозначаются с помощью ключевых слов (None, True, False) и специального токена многоточия (...).

2.5. Строковые литералы и литералы байтовString and Bytes literals

Строковые литералы – это текст, заключённый в одинарные (') или двойные кавычки ("). Например:

"spam"
'eggs'

Кавычка, открывающая литерал, также и закрывает его, поэтому строковый литерал может содержать только другую кавычку (за исключением управляющих последовательностей, см. ниже). Например:

'Say "Hello", please.'
"Don't do that!"

За исключением этого ограничения, выбор символа кавычки (' или ") не влияет на то, как разбирается литерал.

Внутри строкового литерала символ обратной косой черты (\) вводит управляющую последовательность, имеющую специальное значение в зависимости от символа после обратной косой черты. Например, \" обозначает символ двойной кавычки и не завершает строку:

>>> print("Say \"Hello\" to everyone!")
Say "Hello" to everyone!

См. управляющие последовательности ниже для полного списка таких последовательностей и дополнительных подробностей.

2.5.1. Строки в тройных кавычкахTriple-quoted strings

Строки также могут быть заключены в соответствующие группы из трёх одинарных или двойных кавычек. Их обычно называют строками с тройными кавычками:

"""Это строка в тройных кавычках."""

В литералах с тройными кавычками допускаются неэкранированные кавычки (и они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают литерал, если они того же типа (' или "), что использовались в начале:

"""В этой строке есть "кавычки" внутри."""

Неэкранированные символы новой строки также допускаются и сохраняются:

'''Эта строка в тройных кавычках
продолжается на следующей строке.'''

2.5.2. Префиксы строкString prefixes

Строковые литералы могут иметь необязательный префикс, который влияет на то, как разбирается содержимое литерала, например:

b"data"
f'{result=}'

Допустимые префиксы:

Подробнее о каждом типе см. в соответствующих разделах по ссылкам.

Префиксы нечувствительны к регистру (например, «B» работает так же, как «b»). Префикс «r» можно комбинировать с «f», «t» или «b», так что «fr», «rf», «tr», «rt», «br» и «rb» также являются допустимыми префиксами.

Добавлено в версии 3.3: Префикс 'rb' для сырых байтовых литералов был добавлен как синоним 'br'.

Поддержка устаревшего литерала Unicode (u'value') была восстановлена, чтобы упростить поддержку кодовых баз, работающих одновременно на Python 2.x и 3.x. Подробнее см. PEP 414.

2.5.3. Формальная грамматикаFormal grammar

Строковые литералы, за исключением «f-строк» и «t-строк», описываются следующими лексическими определениями.

В этих определениях используются отрицательные опережающие проверки (!), чтобы указать, что конечная кавычка завершает литерал.

STRING:          [stringprefix] (stringcontent)
stringprefix:    <("r" | "u" | "b" | "br" | "rb"), case-insensitive>
stringcontent:
   | "'''" ( !"'''" longstringitem)* "'''"
   | '"""' ( !'"""' longstringitem)* '"""'
   | "'" ( !"'" stringitem)* "'"
   | '"' ( !'"' stringitem)* '"'
stringitem:      stringchar | stringescapeseq
stringchar:      <any source_character, except backslash and newline>
longstringitem:  stringitem | newline
stringescapeseq: "\" <any source_character>

Обратите внимание, что, как и во всех лексических определениях, пробельные символы значимы. В частности, префикс (если он есть) должен непосредственно предшествовать открывающей кавычке.

2.5.4. Escape-последовательностиEscape sequences

Если не указан префикс «r» или «R», escape-последовательности в строковых и байтовых литералах интерпретируются по правилам, аналогичным используемым в стандартном C. Распознаваемые escape-последовательности:

Escape-последовательность

Значение

\<новая строка>

Игнорируемый конец строки

\\

Обратная косая черта

\'

Одинарная кавычка

\"

Двойная кавычка

\a

ASCII Bell (BEL)

\b

ASCII Backspace (BS)

\f

ASCII Formfeed (FF)

\n

ASCII Linefeed (LF)

\r

ASCII Carriage Return (CR)

\t

ASCII горизонтальная табуляция (TAB)

\v

ASCII вертикальная табуляция (VT)

\ooo

восьмеричный символ

\xhh

шестнадцатеричный символ

\N{name}

именованный символ Unicode

\uxxxx

шестнадцатеричный символ Unicode

\Uxxxxxxxx

шестнадцатеричный символ Unicode

2.5.4.1. Игнорируемый конец строкиIgnored end of line

Обратную косую черту можно добавить в конце строки, чтобы игнорировать символ новой строки:

>>> 'This string will not include \
... backslashes or newline characters.'
'This string will not include backslashes or newline characters.'

Того же результата можно достичь с помощью строк в тройных кавычках, или круглых скобок и конкатенации строковых литералов.

2.5.4.2. Экранированные символыEscaped characters

Чтобы включить обратную косую черту в необработанный строковый литерал Python, её нужно удвоить. Управляющая последовательность \\ обозначает один символ обратной косой черты:

>>> print('C:\\Program Files')
C:\Program Files

Аналогично, последовательности \' и \" обозначают символы одинарной и двойной кавычки соответственно:

>>> print('\' and \"')
' and "

2.5.4.3. Восьмеричный символOctal character

Последовательность \ooo обозначает символ с восьмеричным (основание 8) значением ooo:

>>> '\120'
'P'

Допускается до трёх восьмеричных цифр (от 0 до 7).

В литерале bytes символ означает байт с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.

Изменено в версии 3.11: Восьмеричные управляющие последовательности со значением больше 0o377 (255) вызывают DeprecationWarning.

Изменено в версии 3.12: Восьмеричные управляющие последовательности со значением больше 0o377 (255) вызывают SyntaxWarning. В будущей версии Python они будут вызывать SyntaxError.

2.5.4.4. Шестнадцатеричный символHexadecimal character

Последовательность \xhh обозначает символ с шестнадцатеричным (основание 16) значением hh:

>>> '\x50'
'P'

В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.

В литерале bytes символ означает байт с заданным значением. В строковом литерале он означает символ Unicode с заданным значением.

2.5.4.5. Именованный символ UnicodeNamed Unicode character

Последовательность \N{name} обозначает символ Unicode с заданным именем:

>>> '\N{LATIN CAPITAL LETTER P}'
'P'
>>> '\N{SNAKE}'
'🐍'

Эта последовательность не может появляться в литералах bytes.

Изменено в версии 3.3: Добавлена поддержка псевдонимов имён .

2.5.4.6. Шестнадцатеричные символы UnicodeHexadecimal Unicode characters

Эти последовательности \uxxxx и \Uxxxxxxxx обозначают символ Unicode с заданным шестнадцатеричным (основание 16) значением. Для \u требуется ровно четыре цифры; для \U требуется ровно восемь цифр. Последняя может кодировать любой символ Unicode.

>>> '\u1234'
'ሴ'
>>> '\U0001f40d'
'🐍'

Эти последовательности не могут появляться в литералах bytes.

2.5.4.7. Неизвестные escape-последовательностиUnrecognized escape sequences

В отличие от стандартного C, все неизвестные escape-последовательности остаются в строке без изменений, то есть обратная косая черта сохраняется в результате:

>>> print('\q')
\q
>>> list('\q')
['\\', 'q']

Обратите внимание: для байтовых литералов escape-последовательности, распознаваемые только в строковых литералах (\N..., \u..., \U...), относятся к категории нераспознанных escape-последовательностей.

Изменено в версии 3.6: Нераспознанные escape-последовательности приводят к появлению DeprecationWarning.

Изменено в версии 3.12: Нераспознанные escape-последовательности приводят к появлению SyntaxWarning. В будущей версии Python они будут вызывать SyntaxError.

2.5.5. Байтовые литералыBytes literals

Байтовые литералы всегда имеют префикс 'b' или 'B'; они создают экземпляр типа bytes вместо типа str. Они могут содержать только символы ASCII; байты со значением 128 или больше должны быть представлены с помощью escape-последовательностей (обычно шестнадцатеричный символ или восьмеричный символ):

>>> b'\x89PNG\r\n\x1a\n'
b'\x89PNG\r\n\x1a\n'
>>> list(b'\x89PNG\r\n\x1a\n')
[137, 80, 78, 71, 13, 10, 26, 10]

Аналогично, нулевой байт должен быть выражен с помощью escape-последовательности (обычно \0 или \x00).

2.5.6. Сырые строковые литералыRaw string literals

Как строковые, так и байтовые литералы могут по желанию иметь префикс 'r' или 'R'; такие конструкции называются сырыми строковыми литералами и сырыми байтовыми литералами соответственно и обрабатывают обратную косую черту как буквенный символ. В результате в сырых строковых литералах escape-последовательности не обрабатываются особым образом:

>>> r'\d{4}-\d{2}-\d{2}'
'\\d{4}-\\d{2}-\\d{2}'

Даже в сыром литерале кавычки можно экранировать обратной косой чертой, но обратная косая черта остаётся в результате; например, r"\"" – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; r"\" – это недопустимый строковый литерал (даже сырая строка не может заканчиваться нечётным количеством обратных косых черт). В частности, сырой литерал не может заканчиваться одной обратной косой чертой (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе литерала, а не как продолжение строки.

2.5.7. f-строкиf-strings

Добавлено в версии 3.6.

Изменено в версии 3.7: В выражениях внутри f-строк теперь можно использовать await и async for.

Изменено в версии 3.8: Добавлен спецификатор отладки (=)

Изменено в версии 3.12: Снято множество ограничений на выражения внутри f-строк. В частности, теперь разрешены вложенные строки, комментарии и обратные косые черты.

Форматированный строковый литерал или f-строка – это строковый литерал с префиксом 'f' или 'F'. В отличие от других строковых литералов, f-строки не имеют постоянного значения. Они могут содержать поля подстановки, ограниченные фигурными скобками {}. Поля подстановки содержат выражения, которые вычисляются во время выполнения. Например:

>>> who = 'nobody'
>>> nationality = 'Spanish'
>>> f'{who.title()} expects the {nationality} Inquisition!'
'Nobody expects the Spanish Inquisition!'

Любые удвоенные фигурные скобки ({{ или }}) вне полей подстановки заменяются соответствующей одинарной фигурной скобкой:

>>> print(f'{{...}}')
{...}

Другие символы вне полей подстановки обрабатываются как в обычных строковых литералах. Это означает, что escape-последовательности декодируются (за исключением случаев, когда литерал также помечен как сырая строка), и в f-строках с тройными кавычками возможны новые строки:

>>> name = 'Galahad'
>>> favorite_color = 'blue'
>>> print(f'{name}:\t{favorite_color}')
Galahad:       blue
>>> print(rf"C:\Users\{name}")
C:\Users\Galahad
>>> print(f'''Three shall be the number of the counting
... and the number of the counting shall be three.''')
Three shall be the number of the counting
and the number of the counting shall be three.

Выражения в форматированных строковых литералах обрабатываются как обычные выражения Python. Каждое выражение вычисляется в контексте, где появляется форматированный строковый литерал, слева направо. Пустое выражение не допускается, и как lambda, так и выражения присваивания := должны быть окружены явными круглыми скобками:

>>> f'{(half := 1/2)}, {half * 42}'
'0.5, 21.0'

Повторное использование типа кавычек внешней f-строки внутри поля подстановки разрешено:

>>> a = dict(x=2)
>>> f"abc {a["x"]} def"
'abc 2 def'

Обратные косые черты также допускаются в полях подстановки и вычисляются так же, как в любом другом контексте:

>>> a = ["a", "b", "c"]
>>> print(f"List a contains:\n{"\n".join(a)}")
List a contains:
a
b
c

Возможно вложение f-строк:

>>> name = 'world'
>>> f'Repeated:{f' hello {name}' * 3}'
'Repeated: hello world hello world hello world'

Переносимые программы на Python не должны использовать более 5 уровней вложенности.

Особенность реализации CPython: CPython не ограничивает вложенность f-строк.

Выражения подстановки могут содержать новые строки как в f-строках с одинарными кавычками, так и с тройными, и они могут содержать комментарии. Всё, что следует после # внутри поля подстановки, является комментарием (даже закрывающие скобки и кавычки). Это означает, что поля подстановки с комментариями должны быть закрыты на другой строке:

>>> a = 2
>>> f"abc{a  # This comment  }"  continues until the end of the line
...       + 3}"
'abc5'

После выражения поля подстановки могут по желанию содержать:

  • спецификатор отладки – знак равенства (=), по желанию окружённый пробелами с одной или обеих сторон;

  • спецификатор преобразования!s, !r или !a; и/или

  • спецификатор формата с префиксом в виде двоеточия (:).

См. раздел «f-строки» в стандартной библиотеке для подробностей о том, как вычисляются эти поля.

Как объясняется в этом разделе, спецификаторы формата передаются вторым аргументом функции format() для форматирования значения поля подстановки. Например, их можно использовать для указания ширины поля и символов заполнения с помощью миниязыка спецификации формата:

>>> number = 14.3
>>> f'{number:20.7f}'
'          14.3000000'

Спецификаторы формата верхнего уровня могут включать вложенные поля подстановки:

>>> field_size = 20
>>> precision = 7
>>> f'{number:{field_size}.{precision}f}'
'          14.3000000'

Эти вложенные поля могут включать собственные поля преобразования и спецификаторы формата:

>>> number = 3
>>> f'{number:{field_size}}'
'                   3'
>>> f'{number:{field_size:05}}'
'00000000000000000003'

Однако эти вложенные поля не могут включать более глубоко вложенные поля подстановки.

Форматированные строковые литералы не могут использоваться в качестве строк документации, даже если они не содержат выражений:

>>> def foo():
...     f"Not a docstring"
...
>>> print(foo.__doc__)
None

См. также

  • PEP 498 – Интерполяция строковых литералов

  • PEP 701 – Синтаксическая формализация f-строк

  • str.format(), в котором используется связанный механизм строк форматирования.

2.5.8. t-строкиt-strings

Добавлено в версии 3.14.

Шаблонный строковый литерал или t-строка – это строковый литерал с префиксом ‘t’ или ‘T’. Такие строки подчиняются тем же правилам синтаксиса, что и f-строки (форматированные строковые литералы). Об отличиях в правилах вычисления см. раздел о t-строках в стандартной библиотеке

2.5.9. Формальная грамматика f-строкFormal grammar for f-strings

F-строки обрабатываются частично лексическим анализатором, который генерирует токены FSTRING_START, FSTRING_MIDDLE и FSTRING_END, а частично – парсером, который обрабатывает выражения в поле подстановки. Точное распределение работы зависит от реализации CPython.

Соответственно, грамматика f-строк представляет собой смесь лексических и синтаксических определений.

Пробельные символы значимы в следующих ситуациях:

  • В FSTRING_START не должно быть пробелов (между префиксом и кавычкой).

  • Пробелы в FSTRING_MIDDLE являются частью содержимого строкового литерала.

  • В fstring_replacement_field, если присутствует f_debug_specifier, все пробелы после открывающей фигурной скобки до f_debug_specifier, а также пробелы, следующие непосредственно за f_debug_specifier, сохраняются как часть выражения.

    Деталь реализации CPython: Выражение не обрабатывается на этапе токенизации; оно извлекается из исходного кода с использованием позиций токена { и токена после =.

Определение FSTRING_MIDDLE использует отрицательные опережающие проверки (!) для обозначения специальных символов (обратная косая черта, новая строка, {, }) и последовательностей (f_quote).

fstring:    FSTRING_START fstring_middle* FSTRING_END

FSTRING_START:      fstringprefix ("'" | '"' | "'''" | '"""')
FSTRING_END:        f_quote
fstringprefix:      <("f" | "fr" | "rf"), case-insensitive>
f_debug_specifier:  '='
f_quote:            <the quote character(s) used in FSTRING_START>

fstring_middle:
   | fstring_replacement_field
   | FSTRING_MIDDLE
FSTRING_MIDDLE:
   | (!"\" !newline !'{' !'}' !f_quote) source_character
   | stringescapeseq
   | "{{"
   | "}}"
   | <newline, in triple-quoted f-strings only>
fstring_replacement_field:
   | '{' f_expression [f_debug_specifier] [fstring_conversion]
         [fstring_full_format_spec] '}'
fstring_conversion:
   | "!" ("s" | "r" | "a")
fstring_full_format_spec:
   | ':' fstring_format_spec*
fstring_format_spec:
   | FSTRING_MIDDLE
   | fstring_replacement_field
f_expression:
   | ','.(conditional_expression | "*" or_expr)+ [","]
   | yield_expression

Примечание

В приведённом фрагменте грамматики правила f_quote и FSTRING_MIDDLE являются контекстно-зависимыми – они зависят от содержимого FSTRING_START ближайшего окружающего fstring.

Построение более традиционной формальной грамматики из этого шаблона оставляется читателю в качестве упражнения.

Грамматика t-строк идентична грамматике f-строк, с заменой t на f в начале имён правил и токенов, а также в префиксе.

tstring:    TSTRING_START tstring_middle* TSTRING_END

<rest of the t-string grammar is omitted; see above>

2.6. Числовые литералыNumeric literals

Токены NUMBER представляют числовые литералы, которые бывают трёх типов: целые числа, числа с плавающей точкой и мнимые числа.

NUMBER: integer | floatnumber | imagnumber

Числовое значение числового литерала совпадает со значением, которое получилось бы при передаче строки конструктору класса int, float или complex соответственно. Обратите внимание, что не все допустимые входные данные для этих конструкторов являются литералами.

Числовые литералы не включают знак; выражение вроде -1 – это на самом деле выражение, состоящее из унарного оператора ‘-’ и литерала 1.

2.6.1. Целочисленные литералыInteger literals

Целочисленные литералы обозначают целые числа. Например:

7
3
2147483647

Длина целочисленных литералов не ограничена ничем, кроме доступной памяти:

7922816251426433759354395033679228162514264337593543950336

Символы подчёркивания можно использовать для группировки цифр для улучшения читаемости; они игнорируются при определении числового значения литерала. Например, следующие литералы эквивалентны:

100_000_000_000
100000000000
1_00_00_00_00_000

Символы подчёркивания могут находиться только между цифрами. Например, _123, 321_ и 123__321 не являются допустимыми литералами.

Целые числа могут быть заданы в двоичной (основание 2), восьмеричной (основание 8) или шестнадцатеричной (основание 16) системе с помощью префиксов 0b, 0o и 0x соответственно. Шестнадцатеричные цифры от 10 до 15 обозначаются буквами от A до F без учёта регистра. Например:

0b100110111
0b_1110_0101
0o177
0o377
0xdeadbeef
0xDead_Beef

Символ подчёркивания может следовать за указателем основания. Например, 0x_1f – допустимый литерал, а 0_x1f и 0x__1f – нет.

Ведущие нули в ненулевом десятичном числе не допускаются. Например, 0123 не является допустимым литералом. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.

Формально целочисленные литералы описываются следующими лексическими определениями:

integer:      decinteger | bininteger | octinteger | hexinteger | zerointeger
decinteger:   nonzerodigit (["_"] digit)*
bininteger:   "0" ("b" | "B") (["_"] bindigit)+
octinteger:   "0" ("o" | "O") (["_"] octdigit)+
hexinteger:   "0" ("x" | "X") (["_"] hexdigit)+
zerointeger:  "0"+ (["_"] "0")*
nonzerodigit: "1"..."9"
digit:        "0"..."9"
bindigit:     "0" | "1"
octdigit:     "0"..."7"
hexdigit:     digit | "a"..."f" | "A"..."F"

Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.

2.6.2. Литералы с плавающей точкойFloating-point literals

Литералы с плавающей точкой (float), такие как 3.14 или 1.5, обозначают приближения вещественных чисел.

Они состоят из целой и дробной частей, каждая из которых состоит из десятичных цифр. Части разделяются десятичной точкой .:

2.71828
4.0

В отличие от целочисленных литералов, ведущие нули допускаются. Например, 077.010 допустимо и обозначает то же число, что и 77.01.

Как и в целочисленных литералах, одиночные символы подчёркивания могут встречаться между цифрами для улучшения читаемости:

96_485.332_123
3.14_15_93

Любая из этих частей, но не обе, может быть пустой. Например:

10.  # (эквивалентно 10.0)
.001  # (эквивалентно 0.001)

Целая и дробная части могут дополнительно сопровождаться экспонентой: буква e или E, после которой может идти знак (+ или -), а затем число, записанное в том же формате, что и целая с дробной частями. e или E означает «умножить на десять в степени»:

1.0e3  # (представляет 1.0×10³, или 1000.0)
1.166e-5  # (представляет 1.166×10⁻⁵, или 0.00001166)
6.02214076e+23  # (представляет 6.02214076×10²³, или 602214076000000000000000.)

В числах с плавающей точкой, содержащих только целую часть и экспоненту, десятичную точку можно опускать:

1e3  # (эквивалентно 1.e3 и 1.0e3)
0e0  # (эквивалентно 0.)

Формально литералы с плавающей точкой описываются следующими лексическими определениями:

floatnumber:
   | digitpart "." [digitpart] [exponent]
   | "." digitpart [exponent]
   | digitpart exponent
digitpart: digit (["_"] digit)*
exponent:  ("e" | "E") ["+" | "-"] digitpart

Изменено в версии 3.6: В литералах теперь разрешены символы подчёркивания для группировки.

2.6.3. Мнимые литералыImaginary literals

В Python есть объекты комплексных чисел, но нет комплексных литералов. Вместо этого мнимые литералы обозначают комплексные числа с нулевой действительной частью.

Например, в математике комплексное число 3+4.2i записывается как действительное число 3, сложенное с мнимым числом 4.2i. Python использует похожий синтаксис, только мнимая единица записывается как j а не как i:

3+4.2j

Это выражение состоит из целочисленного литерала 3, оператора+’ и мнимого литерала 4.2j. Поскольку это три отдельных токена, между ними допускаются пробелы:

3 + 4.2j

Пробелы внутри каждого токена не допускаются. В частности, суффикс j не должен отделяться от числа, перед которым он стоит.

Число перед j имеет тот же синтаксис, что и литерал с плавающей точкой. Таким образом, следующие мнимые литералы допустимы:

4.2j
3.14j
10.j
.001j
1e100j
3.14e-10j
3.14_15_93j

В отличие от литерала с плавающей точкой, десятичную точку можно опустить, если мнимое число имеет только целую часть. Число по-прежнему вычисляется как число с плавающей точкой, а не как целое:

10j
0j
1000000000000000000000000j   # эквивалентно 1e+24j

Суффикс j не чувствителен к регистру. То есть вместо него можно использовать J:

3.14J   # эквивалентно 3.14j

Формально мнимые литералы описываются следующим лексическим определением:

imagnumber: (floatnumber | digitpart) ("j" | "J")

2.7. Операторы и разделителиOperators and delimiters

Следующая грамматика определяет токены операторов и разделителей, то есть общий тип токенов OP. Список этих токенов и их названий также доступен в документации модуля token.

OP:
   | assignment_operator
   | bitwise_operator
   | comparison_operator
   | enclosing_delimiter
   | other_delimiter
   | arithmetic_operator
   | "..."
   | other_op

assignment_operator:   "+=" | "-=" | "*=" | "**=" | "/="  | "//=" | "%=" |
                       "&=" | "|=" | "^=" | "<<=" | ">>=" | "@="  | ":="
bitwise_operator:      "&"  | "|"  | "^"  | "~"   | "<<"  | ">>"
comparison_operator:   "<=" | ">=" | "<"  | ">"   | "=="  | "!="
enclosing_delimiter:   "("  | ")"  | "["  | "]"   | "{"   | "}"
other_delimiter:       ","  | ":"  | "!"  | ";"   | "="   | "->"
arithmetic_operator:   "+"  | "-"  | "**" | "*"   | "//"  | "/"   | "%"
other_op:              "."  | "@"

Примечание

Обычно операторы используются для комбинирования выражений, тогда как разделители служат другим целям. Однако чёткого формального разграничения между этими двумя категориями нет.

Некоторые токены могут выступать как в роли операторов, так и в роли разделителей, в зависимости от контекста. Например, * – это и оператор умножения, и разделитель, используемый для распаковки последовательностей, а @ – это и матричное умножение, и разделитель, которым начинаются декораторы.

Для некоторых токенов различие неочевидно. Например, одни считают ., ( и ) разделителями, а другие видят в них оператор getattr() и оператор(ы) вызова функции.

Некоторые операторы Python, такие как and, or и not in, используют ключевые слова, а не «символы» (токены операторов).

Последовательность из трёх подряд идущих точек (...) имеет особое значение как литерал Ellipsis.