# 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 в следующей главе (Лексический анализ) являются лексическими определениями; а использования в последующих главах — синтаксическими.