1. Введение¶
Это справочное руководство описывает язык программирования Python. Оно не предназначено для использования в качестве учебного пособия.
Хотя я стараюсь быть максимально точным, я решил использовать описание на естественном языке, а не формальные спецификации, для всего, кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным для среднего читателя, но оставит пространство для неоднозначностей. Следовательно, если бы вы прибыли с Марса и попытались заново реализовать Python, опираясь только на этот документ, вам пришлось бы многое угадывать, и в итоге вы, вероятно, реализовали бы совсем другой язык. С другой стороны, если вы используете Python и задаётесь вопросом, каковы точные правила в какой-то конкретной области языка, вы определённо сможете найти их здесь. Если же вы хотели бы увидеть более формальное определение языка, возможно, вы могли бы пожертвовать своим временем — или изобрести машину для клонирования :-).
Опасно добавлять слишком много деталей реализации в справочник по языку — реализация может измениться, и другие реализации того же языка могут работать иначе. С другой стороны, CPython является одной реализацией Python, находящейся в широком использовании (хотя альтернативные реализации продолжают получать поддержку), и её конкретные особенности иногда заслуживают упоминания, особенно там, где реализация накладывает дополнительные ограничения. Поэтому по всему тексту вы найдёте короткие «примечания по реализации».
Каждая реализация Python поставляется с рядом встроенных и стандартных модулей. Они документированы в The Python Standard Library. Некоторые встроенные модули упоминаются тогда, когда они существенно взаимодействуют с определением языка.
1.1. Альтернативные реализации¶
Хотя существует одна реализация Python, которая безусловно наиболее популярна, существуют и альтернативные реализации, представляющие особый интерес для разных аудиторий.
Известные реализации включают:
- CPython
Это оригинальная и самая поддеживаемая реализация Python, написанная на C. Новые возможности языка обычно появляются здесь в первую очередь.
- Jython
Python, реализованный на Java. Эта реализация может использоваться в качестве скриптового языка для приложений Java или для создания приложений с использованием библиотек классов Java. Она также часто используется для создания тестов для библиотек Java. Более подробная информация доступна на сайте Jython.
- Python для .NET
Эта реализация фактически использует CPython, но является управляемым приложением .NET и делает доступными библиотеки .NET. Она была создана Брайаном Ллойдом. Для дополнительной информации см. главную страницу Python для .NET.
- IronPython
Альтернативная реализация Python для .NET. В отличие от Python.NET, это полноценная реализация Python, которая генерирует IL и компилирует код Python непосредственно в сборки .NET. Она была создана Джимом Хьюгинином, первоначальным создателем Jython. Дополнительную информацию можно найти на сайте IronPython.
- PyPy
Реализация Python, полностью написанная на Python. Она поддерживает несколько продвинутых возможностей, отсутствующих в других реализациях, таких как поддержка работы без стека и компилятор Just in Time. Одна из целей проекта — поощрять эксперименты с самим языком, облегчая модификацию интерпретатора (поскольку он написан на 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 в следующей главе (Лексический анализ) являются лексическими определениями; а использования в последующих главах — синтаксическими.