Содержание страницы
1. Введение¶Introduction
Этот справочник описывает язык программирования Python. Он не является учебным пособием.
Хотя я стараюсь быть максимально точным, я решил использовать английский, а не формальные спецификации для всего, кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным для среднего читателя, но оставляет место для неоднозначностей. Следовательно, если бы вы прилетели с Марса и попытались заново реализовать Python, основываясь только на этом документе, вам пришлось бы многое додумывать, и, скорее всего, в итоге получился бы совсем другой язык. С другой стороны, если вы используете Python и хотите узнать точные правила в какой-то конкретной области языка, вы определенно сможете найти их здесь. Если вам хотелось бы увидеть более формальное определение языка, возможно, вы могли бы пожертвовать своим временем – или изобрести машину для клонирования :-).
Добавлять слишком много деталей реализации в справочный документ по языку опасно – реализация может измениться, а другие реализации того же языка могут работать иначе. С другой стороны, CPython – это единственная широко используемая реализация Python (хотя альтернативные реализации продолжают получать поддержку), и его особые причуды иногда стоит упомянуть, особенно там, где реализация накладывает дополнительные ограничения. Поэтому по всему тексту вы найдете короткие «заметки о реализации».
Каждая реализация Python поставляется с набором встроенных и стандартных модулей. Они описаны в Стандартной библиотеке Python. Некоторые встроенные модули упоминаются, когда они существенно взаимодействуют с определением языка.
1.1. Альтернативные реализации¶Alternate Implementations
Хотя существует одна реализация Python, которая является безусловно самой популярной, есть и некоторые альтернативные реализации, представляющие особый интерес для разных аудиторий.
Известные реализации включают:
- CPython
Это оригинальная и наиболее поддерживаемая реализация Python, написанная на C. Новые возможности языка обычно появляются сначала здесь.
- Jython
Python, реализованный на Java. Эта реализация может использоваться как скриптовый язык для Java-приложений или для создания приложений с использованием библиотек классов Java. Она также часто используется для создания тестов для Java-библиотек. Дополнительную информацию можно найти на сайте Jython.
- Python for .NET
Эта реализация на самом деле использует CPython, но является управляемым .NET-приложением и предоставляет доступ к библиотекам .NET. Она была создана Brian Lloyd. Для получения дополнительной информации см. домашнюю страницу Python for .NET.
- IronPython
Альтернативный Python для .NET. В отличие от Python.NET, это полноценная реализация Python, которая генерирует IL и компилирует код Python непосредственно в сборки .NET. Она была создана Jim Hugunin, оригинальным создателем Jython. Для получения дополнительной информации см. сайт IronPython.
- PyPy
Реализация Python, полностью написанная на Python. Она поддерживает несколько расширенных возможностей, отсутствующих в других реализациях, таких как поддержка stackless и JIT-компилятор. Одна из целей проекта – стимулировать эксперименты с самим языком, упрощая модификацию интерпретатора (поскольку он написан на Python). Дополнительная информация доступна на домашней странице проекта PyPy.
Каждая из этих реализаций в той или иной степени отличается от языка, описанного в данном руководстве, или содержит дополнительную информацию, выходящую за рамки стандартной документации Python. Обратитесь к документации конкретной реализации, чтобы узнать все необходимое о той реализации, которую вы используете.
1.2. Нотация¶Notation
Описания лексического анализа и синтаксиса используют грамматическую нотацию, представляющую собой смесь 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. Лексические и синтаксические определения¶Lexical and Syntactic definitions
Существует некоторое различие между лексическим и синтаксическим анализом: лексический анализатор работает с отдельными символами исходного текста, в то время как парсер (синтаксический анализатор) работает с потоком токенов, порождённых лексическим анализом. Однако в некоторых случаях точная граница между двумя фазами является деталью реализации CPython.
Практическое различие между ними заключается в том, что в лексических определениях
все пробельные символы значимы.
Лексический анализатор отбрасывает все пробельные символы, которые не преобразуются
в токены, такие как token.INDENT или NEWLINE.
Синтаксические определения затем используют эти токены, а не символы исходного текста.
В этой документации используется одна и та же грамматика BNF для обоих стилей определений. Все случаи использования BNF в следующей главе (Лексический анализ) являются лексическими определениями; использования в последующих главах – синтаксическими определениями.