Введение
В этом справочном руководстве описан язык программирования Python. Оно не предназначено для обучения.
Хотя я стараюсь быть как можно точнее, я решил использовать английский язык вместо формальных спецификаций для всего, кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным для обычного читателя, но оставит место для неоднозначностей. Поэтому, если бы вы прилетели с Марса и попытались заново реализовать Python, опираясь только на этот документ, вам, возможно, пришлось бы кое-что угадать, и, скорее всего, вы в итоге реализовали бы совершенно другой язык. С другой стороны, если вы используете Python и хотите узнать точные правила для определённой части языка, то здесь вы наверняка сможете найти их. Если вы хотели бы увидеть более формальное определение языка, возможно, вы могли бы выделить на это время — или изобрести машину для клонирования :-).
Добавлять слишком много подробностей реализации в справочное руководство по языку опасно — реализация может измениться, а другие реализации того же языка могут работать иначе. С другой стороны, CPython — единственная широко распространённая реализация Python (хотя альтернативные реализации продолжают получать поддержку), и о некоторых её особенностях иногда стоит упомянуть, особенно если реализация накладывает дополнительные ограничения. Поэтому в тексте вы найдёте краткие «примечания о реализации».
Каждая реализация Python включает ряд встроенных и стандартных модулей. Они описаны в Стандартной библиотеке Python. Несколько встроенных модулей упоминаются в тех случаях, когда они существенно взаимодействуют с определением языка.
1.1. Альтернативные реализации
Хотя одна реализация Python значительно популярнее остальных, существуют и альтернативные реализации, представляющие особый интерес для разных аудиторий.
К известным реализациям относятся:
- CPython
-
Это оригинальная и наиболее активно поддерживаемая реализация Python, написанная на C. Новые возможности языка, как правило, сначала появляются здесь.
- Jython
-
Реализация Python на Java. Её можно использовать как язык сценариев для приложений Java или для создания приложений с использованием библиотек классов Java. Её также часто используют для создания тестов библиотек Java. Дополнительные сведения можно найти на сайте Jython.
- Python for .NET
-
Эта реализация фактически использует CPython, но является управляемым приложением .NET и предоставляет доступ к библиотекам .NET. Её создал Брайан Ллойд. Дополнительные сведения см. на главной странице Python for .NET.
- IronPython
-
Альтернативная реализация Python для .NET. В отличие от Python.NET, это полноценная реализация Python, которая генерирует IL и компилирует код Python непосредственно в сборки .NET. Её создал Джим Хьюгин, первоначальный создатель Jython. Дополнительные сведения см. на сайте IronPython.
- PyPy
-
Реализация Python, полностью написанная на Python. Она поддерживает несколько расширенных возможностей, отсутствующих в других реализациях, например поддержку stackless и JIT-компилятор. Одна из целей проекта — поощрять эксперименты с самим языком, упрощая изменение интерпретатора (поскольку он написан на Python). Дополнительные сведения доступны на главной странице проекта PyPy.
Каждая из этих реализаций в чём-либо отличается от языка, описанного в этом руководстве, или содержит специфические сведения, выходящие за рамки стандартной документации Python. Обратитесь к документации конкретной реализации, чтобы узнать, что ещё необходимо знать об используемой вами реализации.
1.2. Обозначения
В описаниях лексического анализа и синтаксиса используется грамматическая нотация, представляющая собой сочетание EBNF и PEG. Например:
name: letter (letter | digit | "_")* letter: "a"..."z" | "A"..."Z" digit: "0"..."9"
В этом примере первая строка означает, что name — это letter, за которым следует последовательность из нуля или более letter, digit и символов подчёркивания. В свою очередь, letter — это любой из одиночных символов от 'a' до 'z' и от A до Z; digit — это один символ из диапазона от 0 до 9.
Каждое правило начинается с имени (которое обозначает определяемое правило), за которым следуют двоеточие и :. В определении справа от двоеточия используются следующие элементы синтаксиса:
-
name: Имя ссылается на другое правило. Если возможно, оно является ссылкой на определение этого правила.-
TOKEN: Имя, записанное заглавными буквами, обозначает токен. В грамматических определениях токены эквивалентны правилам.
-
-
"text",'text': Текст в одинарных или двойных кавычках должен совпадать буквально (без кавычек). Тип кавычек выбирается в соответствии со значениемtext:-
'if': Имя в одинарных кавычках обозначает ключевое слово. -
"case": Имя в двойных кавычках обозначает мягкое ключевое слово. -
'@': Символ, не являющийся буквой, в одинарных кавычках обозначает токенOP, то есть разделитель или оператор.
-
-
e1 e2: Элементы, разделённые только пробельными символами, обозначают последовательность. Здесьe1должен следовать заe2. -
e1 | e2: Вертикальная черта используется для разделения альтернатив. Она обозначает «упорядоченный выбор» в PEG: если совпадаетe1,e2не рассматривается. В традиционных грамматиках PEG вместо вертикальной черты используется косая черта/. Дополнительные сведения и пояснения см. в PEP 617. -
e*: Звёздочка означает ноль или более повторений предшествующего элемента. -
e+: Аналогично, знак «плюс» означает одно или более повторений. -
[e]: Фраза в квадратных скобках означает ноль или одно вхождение. Другими словами, заключённая в скобки фраза необязательна. -
e?: Вопросительный знак имеет точно такое же значение, что и квадратные скобки: предшествующий элемент необязателен. -
(e): Круглые скобки используются для группировки.
Следующая нотация используется только в лексических определениях.
-
"a"..."z": Два буквальных символа, разделённые тремя точками, обозначают выбор любого одиночного символа из указанного диапазона ASCII (включительно). -
<...>: Фраза в угловых скобках даёт неформальное описание совпавшего символа (например,<any ASCII character except "\">) или сокращение, определённое в ближайшем тексте (например,<Lu>).
В некоторых определениях также используются просмотры вперёд, указывающие, что элемент должен (или не должен) совпадать в заданной позиции, но при этом не потребляющие входные данные:
-
&e: положительный просмотр вперёд (то есть требуется совпадение сe) -
!e: отрицательный просмотр вперёд (то есть требуется, чтобыeне совпадал)
Унарные операторы (*, +, ?) имеют наивысший приоритет; вертикальная черта (|) — наименьший.
Пробельные символы имеют значение только для разделения токенов.
Правила обычно умещаются в одну строку, но слишком длинные правила могут переноситься:
literal: stringliteral | bytesliteral
| integer | floatnumber | imagnumber
Кроме того, правила можно форматировать так, чтобы первая строка заканчивалась двоеточием, а каждая альтернатива начиналась с вертикальной черты на новой строке. Например:
literal: | stringliteral | bytesliteral | integer | floatnumber | imagnumber
Это не означает, что первая альтернатива пуста.
1.2.1. Лексические и синтаксические определения
Между лексическим и синтаксическим анализом есть различие: лексический анализатор обрабатывает отдельные символы исходного кода, а анализатор (синтаксический анализатор) обрабатывает поток токенов, полученный в результате лексического анализа. Однако в некоторых случаях точная граница между этими двумя этапами является деталью реализации CPython.
Практическое различие между ними заключается в том, что в лексических определениях все пробельные символы имеют значение. Лексический анализатор отбрасывает все пробельные символы, которые не преобразуются в такие токены, как token.INDENT или NEWLINE. В синтаксических определениях затем используются эти токены, а не символы исходного кода.
В этой документации для обоих типов определений используется одна и та же грамматика BNF. Все случаи использования BNF в следующей главе (Лексический анализ) представляют собой лексические определения; в последующих главах используются синтаксические определения.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/reference/introduction.html