Содержание страницы
2. Лексический анализ¶Lexical analysis
Программа на Python читается синтаксическим анализатором. На вход синтаксического анализатора подаётся поток токенов, генерируемых лексическим анализатором (также называемым токенизатором). В этой главе описывается, как лексический анализатор создаёт эти токены.
Лексический анализатор определяет кодировку текста программы
(по умолчанию UTF-8) и декодирует текст в
исходные символы.
Если текст не удаётся декодировать, возбуждается исключение SyntaxError.
Затем лексический анализатор использует исходные символы для генерации потока токенов. Тип генерируемого токена обычно зависит от следующего исходного символа, который должен быть обработан. Аналогично, другое специальное поведение анализатора зависит от первого исходного символа, который ещё не был обработан. В следующей таблице приведён краткий обзор этих исходных символов со ссылками на разделы, содержащие дополнительную информацию.
Символ |
Следующий токен (или соответствующая документация) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.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_startname_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.
Некоторые имена зарезервированы только в определённых контекстах. Они называются мягкими ключевыми словами:
Синтаксически они ведут себя как ключевые слова в своих контекстах, но это различие проводится на уровне синтаксического анализатора, а не при токенизации.
Будучи мягкими ключевыми словами, их использование в грамматике возможно, при этом сохраняется совместимость с существующим кодом, который использует эти имена как имена идентификаторов.
Изменено в версии 3.12: type теперь является мягким ключевым словом.
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>– прописные буквы (включаетA–Z)Категория Unicode
<Ll>– строчные буквы (включаетa–z)Категория 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>– десятичные числа (включает0–9)Категория Unicode
<Pc>– соединительные знаки пунктуацииКатегория Unicode
<Mn>– некомбинируемые знакиКатегория Unicode
<Mc>– комбинируемые знаки с увеличением ширины<Other_ID_Continue>– ещё один явный набор символов из PropList.txt для поддержки обратной совместимости
Снова xid_continue замыкает это множество относительно нормализации NFKC.
Категории Unicode используют версию базы данных символов Unicode,
включённую в модуль unicodedata.
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=}'
Допустимые префиксы:
r: Сырая строкаf: Форматированный строковый литерал («f-строка»)t: Шаблонный строковый литерал («t-строка»)u: Нет эффекта (допускается для обратной совместимости)
Подробнее о каждом типе см. в соответствующих разделах по ссылкам.
Префиксы нечувствительны к регистру (например, «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|stringescapeseqstringchar: <anysource_character, except backslash and newline> longstringitem:stringitem| newline stringescapeseq: "\" <anysource_character>
Обратите внимание, что, как и во всех лексических определениях, пробельные символы значимы. В частности, префикс (если он есть) должен непосредственно предшествовать открывающей кавычке.
2.5.4. Escape-последовательности¶Escape sequences
Если не указан префикс «r» или «R», escape-последовательности в строковых и
байтовых литералах интерпретируются по правилам, аналогичным используемым в
стандартном C. Распознаваемые escape-последовательности:
Escape-последовательность |
Значение |
|---|---|
|
|
|
|
|
|
|
|
|
ASCII Звонок (BEL) |
|
ASCII Забой (BS) |
|
ASCII Перевод страницы (FF) |
|
ASCII Перевод строки (LF) |
|
ASCII Возврат каретки (CR) |
|
ASCII горизонтальная табуляция (TAB) |
|
ASCII вертикальная табуляция (VT) |
|
|
|
|
|
|
|
|
|
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. Именованный символ Unicode¶Named Unicode character
Последовательность \N{name} обозначает символ Unicode
с заданным именем:
>>> '\N{LATIN CAPITAL LETTER P}'
'P'
>>> '\N{SNAKE}'
'🐍'
Эта последовательность не может появляться в литералах bytes.
Изменено в версии 3.3: Добавлена поддержка псевдонимов имён .
2.5.4.6. Шестнадцатеричные символы Unicode¶Hexadecimal 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.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_STARTfstring_middle*FSTRING_ENDFSTRING_START:fstringprefix("'" | '"' | "'''" | '"""') FSTRING_END:f_quotefstringprefix: <("f" | "fr" | "rf"), case-insensitive> f_debug_specifier: '=' f_quote: <the quote character(s) used in FSTRING_START> fstring_middle: |fstring_replacement_field|FSTRING_MIDDLEFSTRING_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_fieldf_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|zerointegerdecinteger: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] |digitpartexponentdigitpart: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.
2.1.3. Комментарии¶Comments
Комментарий начинается с символа решётки (
#), не являющегося частью строкового литерала, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если не применяются правила неявного объединения строк. Комментарии игнорируются синтаксисом.