1. Введение

В этом справочном руководстве описывается язык программирования Python. Оно не является учебным пособием.

Хотя я стараюсь быть как можно более точным, я решил использовать английский язык, а не формальные спецификации для всего, кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным для обычного читателя, но оставит место для двусмысленностей. Следовательно, если бы вы прилетели с Марса и попытались реализовать Python только на основе этого документа, вам пришлось бы догадываться о многом, и в итоге вы, вероятно, реализовали бы совсем другой язык. С другой стороны, если вы используете Python и задаетесь вопросом, каковы точные правила в той или иной области языка, вы определенно сможете найти их здесь. Если вы хотите увидеть более формальное определение языка, то, возможно, вы могли бы посвятить ему свое время — или изобрести машину для клонирования :-).

Опасно добавлять слишком много деталей реализации в справочный документ по языку - реализация может измениться, и другие реализации того же языка могут работать по-другому. С другой стороны, CPython - это единственная широко используемая реализация Python (хотя альтернативные реализации продолжают получать поддержку), и ее специфические причуды иногда стоит упомянуть, особенно в тех случаях, когда реализация накладывает дополнительные ограничения. Поэтому по всему тексту вы найдете краткие «заметки о реализации».

Каждая реализация Python поставляется с рядом встроенных и стандартных модулей. Они документированы в Стандартная библиотека Python. Несколько встроенных модулей упоминаются, когда они существенным образом взаимодействуют с определением языка.

1.1. Альтернативные варианты реализации

Хотя существует одна реализация Python, которая, безусловно, является самой популярной, есть несколько альтернативных реализаций, которые представляют особый интерес для разных аудиторий.

Известные реализации включают:

CPython

Это оригинальная и наиболее поддерживаемая реализация Python, написанная на языке C. Новые возможности языка обычно появляются здесь первыми.

Jython

Python, реализованный на языке Java. Эта реализация может использоваться в качестве языка сценариев для Java-приложений или для создания приложений с использованием библиотек классов Java. Он также часто используется для создания тестов для библиотек Java. Более подробную информацию можно найти на сайте the Jython website.

Python для .NET

Эта реализация фактически использует реализацию CPython, но является управляемым приложением .NET и предоставляет доступ к библиотекам .NET. Она была создана Брайаном Ллойдом. Дополнительную информацию можно найти в Python for .NET home page.

IronPython

Альтернативный Python для .NET. В отличие от Python.NET, это полноценная реализация Python, которая генерирует IL и компилирует код Python непосредственно в сборки .NET. Она была создана Джимом Хугунином, создателем Jython. Для получения дополнительной информации смотрите the IronPython website.

PyPy

Реализация Python, написанная полностью на языке Python. Поддерживает несколько расширенных возможностей, не встречающихся в других реализациях, таких как поддержка stackless и компилятор Just in Time. Одна из целей проекта - поощрять эксперименты с самим языком, облегчая модификацию интерпретатора (поскольку он написан на Python). Дополнительная информация доступна на the PyPy project’s home page.

Каждая из этих реализаций в чем-то отличается от языка, описанного в данном руководстве, или содержит специфическую информацию, выходящую за рамки стандартной документации по Python. Обратитесь к документации по конкретной реализации, чтобы определить, что еще вам нужно знать о конкретной реализации, которую вы используете.

1.2. Условные обозначения

В описаниях лексического анализа и синтаксиса используется модифицированная Backus–Naur form (BNF) грамматическая нотация. В ней используется следующий стиль определений:

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

В первой строке говорится, что name - это lc_letter, за которым следует последовательность из нуля или более lc_letters и подчеркиваний. В свою очередь, lc_letter - это любой из одиночных символов с 'a' по 'z'. (Это правило фактически соблюдается для имен, определенных в лексических и грамматических правилах в этом документе).

Каждое правило начинается с имени (которое является именем, определяемым правилом) и ::=. Вертикальная полоска (|) используется для разделения альтернатив; в этой нотации она является наименьшим связующим оператором. Звезда (*) означает ноль или более повторений предыдущего элемента; аналогично, плюс (+) означает одно или более повторений, а фраза, заключенная в квадратные скобки ([ ]), означает ноль или одно вхождение (другими словами, заключенная фраза необязательна). Операторы * и + связывают как можно плотнее; для группировки используются круглые скобки. Буквальные строки заключаются в кавычки. Белое пространство имеет смысл только для разделения лексем. Правила обычно содержатся в одной строке; правила с большим количеством альтернатив могут быть отформатированы альтернативно: каждая строка после первой начинается с вертикальной полосы.

В лексических определениях (как в примере выше) используются еще два соглашения: Два буквенных символа, разделенные тремя точками, означают выбор любого символа из заданного (включительно) диапазона символов ASCII. Фраза между угловыми скобками (<...>) дает неформальное описание определяемого символа; например, это может быть использовано для описания понятия «управляющий символ», если это необходимо.

Несмотря на то, что используемая нотация практически одинакова, существует большая разница между значением лексических и синтаксических определений: лексическое определение оперирует отдельными символами входного источника, в то время как синтаксическое определение оперирует потоком лексем, генерируемых лексическим анализом. Все случаи использования БНФ в следующей главе («Лексический анализ») являются лексическими определениями, а в последующих главах - синтаксическими определениями.