1. Введение

В справочном руководстве рассказывается о языке программирования 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 для .NET.
IronPython
Альтернативный Python для .NET. В отличие от Python.NET, это полная реализация Python, которая генерирует IL и компилирует Python код непосредственно в .NET сборки. Он был создан Джимом Хьюгунином, оригинальным создателем Jython. Дополнительные сведения см. на сайте IronPython.
PyPy
Реализация Python, полностью написанная на Python. Она поддерживает несколько расширенных функций, отсутствующих в других реализациях, таких как поддержка работы без стека и JIT (Just in Time) компилятор. Одна из целей проекта — поощрять эксперименты с самим языком, облегчая модификацию интерпретатора (так как он написан на Python). Дополнительная информация доступна на домашней странице проекта PyPy.

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

1.2. Примечание

В описаниях лексического анализа и синтаксиса используется модифицированная грамматическая нотация BNF. При этом используется следующий стиль определения:

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

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

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

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

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