Документация Python неофициальный перевод
Содержание страницы

2. Лексический анализLexical analysis

Программа на Python читается парсером. На вход парсера подаётся поток\nтокенов, генерируемый лексическим анализатором. В этой главе описывается, как\nлексический анализатор разбивает файл на токены.

Python использует 7-битный набор символов ASCII для текста программы.

Новое в версии 2.3: Объявление кодировки можно использовать, чтобы указать, что строковые литералы и комментарии используют кодировку, отличную от ASCII.

Для совместимости со старыми версиями Python только выводит предупреждение, если находит 8-битные символы; эти предупреждения следует исправлять, либо объявив явную кодировку, либо используя escape-последовательности, если эти байты являются двоичными данными, а не символами.

Набор символов времени выполнения зависит от устройств ввода-вывода, подключенных к программе, но в целом является надмножеством ASCII.

Примечание о будущей совместимости: Может возникнуть соблазн предположить, что набор символов для 8-битных символов – это ISO Latin-1 (надмножество ASCII, охватывающее большинство западных языков, использующих латинский алфавит), но не исключено, что в будущем станут распространены текстовые редакторы, работающие с Unicode. Они обычно используют кодировку UTF-8, которая также является надмножеством ASCII, но с совершенно иным использованием символов с порядковыми номерами 128–255. Хотя единого мнения по этому вопросу пока нет, неразумно предполагать ни Latin-1, ни UTF-8, даже если текущая реализация, по-видимому, отдает предпочтение Latin-1. Это относится как к набору символов исходного кода, так и к набору символов времени выполнения.

2.1. Структура строкиLine structure

Программа на Python состоит из нескольких логических строк.

2.1.1. Логические строкиLogical lines

Конец логической строки обозначается токеном NEWLINE. Инструкции не могут пересекать границы логических строк, за исключением случаев, когда NEWLINE допускается синтаксисом (например, между инструкциями в составных инструкциях). Логическая строка строится из одной или нескольких физических строк путём следования правилам явного или неявного объединения строк.

2.1.2. Физические строкиPhysical lines

Физическая строка – это последовательность символов, завершающаяся последовательностью конца строки. В исходных файлах и строках можно использовать любые стандартные для платформы последовательности конца строки: форму Unix с использованием ASCII LF (перевод строки), форму Windows с использованием последовательности ASCII CR LF (возврат каретки и перевод строки) или старую форму Macintosh с символом ASCII CR (возврат каретки). Все эти формы взаимозаменяемы, независимо от платформы. Конец ввода также служит неявным завершителем последней физической строки.

При встраивании Python исходные строки кода должны передаваться в API Python с использованием стандартных соглашений C для символов новой строки (символ \n, представляющий ASCII LF, является терминатором строки).

2.1.3. КомментарииComments

Комментарий начинается с символа решётки (#), не входящего в строковый литерал, и заканчивается в конце физической строки. Комментарий означает конец логической строки, если только не применяются правила неявного объединения строк. Синтаксис игнорирует комментарии; они не являются токенами.

2.1.4. Объявления кодировкиEncoding declarations

Если комментарий в первой или второй строке сценария Python соответствует регулярному выражению coding[=:]\s*([-\w.]+), этот комментарий обрабатывается как объявление кодировки; первая группа этого выражения задаёт кодировку файла исходного кода. Объявление кодировки должно располагаться на отдельной строке. Если оно находится на второй строке, первая строка также должна содержать только комментарий. Рекомендуемые формы выражения кодировки:

# -*- coding: <encoding-name> -*-

которая распознаётся также GNU Emacs, и

# vim:fileencoding=<encoding-name>

которая распознается редактором VIM Брама Моленаара. Кроме того, если первые байты файла содержат метку порядка байтов UTF-8 ('\xef\xbb\xbf'), объявленная кодировка файла считается UTF-8 (это поддерживается, в частности, блокнотом Microsoft).

Если кодировка объявлена, ее имя должно распознаваться Python. Кодировка используется для всего лексического анализа, в частности для нахождения конца строки и интерпретации содержимого литералов Unicode. Строковые литералы преобразуются в Unicode для синтаксического анализа, а затем перед началом интерпретации преобразуются обратно в исходную кодировку.

2.1.5. Явное объединение строкExplicit line joining

Две или более физические строки могут быть объединены в логические строки с помощью символа обратной косой черты (\) следующим образом: если физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующей строкой, образуя одну логическую строку; при этом обратная косая черта и следующий за ней символ конца строки удаляются. Например:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Похоже на корректную дату
        return 1

Строка, заканчивающаяся обратной косой чертой, не может содержать комментарий. Обратная косая черта не продолжает комментарий. Обратная косая черта не продолжает токен, за исключением строковых литералов (т.е. токены, отличные от строковых литералов, нельзя разделять между физическими строками с помощью обратной косой черты). Обратная косая черта недопустима в других местах строки вне строкового литерала.

2.1.6. Неявное объединение строкImplicit line joining

Выражения в круглых, квадратных или фигурных скобках можно разбивать на несколько физических строк без использования обратной косой черты. Например:

month_names = ['Januari', 'Februari', 'Maart',      # Это
               'April',   'Mei',      'Juni',       # голландские названия
               'Juli',    'Augustus', 'September',  # для месяцев
               'Oktober', 'November', 'December']   # года

Неявно продолжаемые строки могут содержать комментарии. Отступ строк продолжения не важен. Допускаются пустые строки продолжения. Между неявно продолжаемыми строками не генерируется токен NEWLINE. Неявно продолжаемые строки также могут встречаться внутри строк в тройных кавычках (см. ниже); в этом случае они не могут содержать комментарии.

2.1.7. Пустые строкиBlank lines

Логическая строка, содержащая только пробелы, табуляции, символы перевода страницы и, возможно, комментарий, игнорируется (т. е. токен NEWLINE не генерируется). При интерактивном вводе операторов обработка пустой строки может различаться в зависимости от реализации цикла чтения-вычисления-вывода. В стандартной реализации полностью пустая логическая строка (т. е. не содержащая даже пробелов или комментария) завершает многострочный оператор.

2.1.8. ОтступыIndentation

Начальные пробельные символы (пробелы и табуляции) в начале логической строки используются для вычисления уровня отступа строки, который, в свою очередь, используется для определения группировки инструкций.

Сначала табуляции заменяются (слева направо) от одного до восьми пробелов так, чтобы общее количество символов до замены и включая ее было кратно восьми (предполагается, что это то же правило, что и в Unix). Затем общее количество пробелов перед первым непробельным символом определяет отступ строки. Отступ нельзя разделять на несколько физических строк с помощью обратной косой черты; пробелы до первой обратной косой черты определяют отступ.

Примечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на платформах, отличных от UNIX, не рекомендуется использовать смесь пробелов и табуляции для отступов в одном исходном файле. Также следует отметить, что разные платформы могут явно ограничивать максимальный уровень отступа.

Символ перевода страницы может присутствовать в начале строки; он будет игнорироваться при вычислении отступа, описанном выше. Символы перевода страницы, встречающиеся в других местах начальных пробельных символов, имеют неопределённый эффект (например, они могут сбросить счётчик пробелов до нуля).

Уровни отступа последовательных строк используются для генерации токенов INDENT и DEDENT, применяя стек, следующим образом.

Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At the beginning of each logical line, the line’s indentation level is compared to the top of the stack. If it is equal, nothing happens. If it is larger, it is pushed on the stack, and one INDENT token is generated. If it is smaller, it must be one of the numbers occurring on the stack; all numbers on the stack that are larger are popped off, and for each number popped off a DEDENT token is generated. At the end of the file, a DEDENT token is generated for each number remaining on the stack that is larger than zero.

Вот пример корректно (хотя и запутанно) оформленного отступами фрагмента кода Python:

def perm(l):
        # Вычислить список всех перестановок l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

Следующий пример показывает различные ошибки отступов:

 def perm(l):                       # ошибка: первая строка с отступом
for i in range(len(l)):             # ошибка: нет отступа
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # ошибка: неожиданный отступ
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # ошибка: несоответствие отступа

(На самом деле первые три ошибки обнаруживаются синтаксическим анализатором; только последняя ошибка обнаруживается лексическим анализатором – отступ return r не соответствует уровню, извлечённому из стека.)

2.1.9. Пробельные символы между токенамиWhitespace between tokens

За исключением начала логической строки или строковых литералов, пробельные символы (пробел, табуляция, перевод страницы) могут использоваться взаимозаменяемо для разделения токенов. Пробел требуется между двумя токенами только в том случае, если их объединение может быть интерпретировано как другой токен (например, ab – один токен, а a b – два токена).

2.2. Прочие токеныOther tokens

Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist: identifiers, keywords, literals, operators, and delimiters. Whitespace characters (other than line terminators, discussed earlier) are not tokens, but serve to delimit tokens. Where ambiguity exists, a token comprises the longest possible string that forms a legal token, when read from left to right.

2.3. Identifiers and keywords

Идентификаторы (также называемые именами) описываются следующими лексическими определениями:

identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"

Идентификаторы не имеют ограничения по длине. Регистр имеет значение.

2.3.1. Ключевые словаKeywords

The following identifiers are used as reserved words, or keywords of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:

and       del       from      not       while
as        elif      global    or        with
assert    else      if        pass      yield
break     except    import    print
class     exec      in        raise
continue  finally   is        return
def       for       lambda    try

Изменено в версии 2.4: None стал константой и теперь распознается компилятором как имя встроенного объекта None. Хотя это не ключевое слово, ему нельзя присвоить другой объект.

Изменено в версии 2.5: Использование as и with в качестве идентификаторов вызывает предупреждение. Чтобы использовать их как ключевые слова, включите будущую возможность with_statement.

Изменено в версии 2.6: as и with стали полноценными ключевыми словами.

2.3.2. Зарезервированные классы идентификаторовReserved classes of identifiers

Некоторые классы идентификаторов (помимо ключевых слов) имеют специальное значение. Эти классы определяются по шаблонам ведущих и завершающих символов подчёркивания:

_*

Не импортируется конструкцией from module import *. Специальный идентификатор _ используется в интерактивном интерпретаторе для хранения результата последнего вычисления; он хранится в модуле __builtin__. Если не в интерактивном режиме, _ не имеет специального значения и не определён. См. раздел Оператор import.

Примечание

Имя _ часто используется в связи с интернационализацией; обратитесь к документации модуля gettext для получения дополнительной информации об этом соглашении.

__*__

Системные имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие системные имена обсуждаются в разделе Специальные имена методов и в других местах. В будущих версиях Python, скорее всего, появится больше таких имён. Любое использование имён __*__, в любом контексте, не соответствующее явно задокументированному назначению, может быть нарушено без предупреждения.

__*

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

2.4. ЛитералыLiterals

Литералы – это обозначения константных значений некоторых встроенных типов.

2.4.1. Строковые литералыString literals

Строковые литералы описываются следующими лексическими определениями:

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"
                     | "b" | "B" | "br" | "Br" | "bR" | "BR"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''"
                     | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | escapeseq
longstringitem  ::=  longstringchar | escapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
escapeseq       ::=  "\" <any ASCII character>

Одно синтаксическое ограничение, не указанное в этих продукциях, заключается в том, что пробелы не допускаются между stringprefix и остальной частью строкового литерала. Набор символов исходного кода определяется объявлением кодировки; если в исходном файле нет объявления кодировки, это ASCII; см. раздел Объявления кодировки.

Простыми словами: строковые литералы могут быть заключены в парные одинарные кавычки (') или двойные кавычки ("). Они также могут быть заключены в парные группы из трех одинарных или двойных кавычек (обычно называются строками в тройных кавычках). Символ обратной косой черты (\) используется для экранирования символов, которые в противном случае имеют специальное значение, таких как новая строка, сама обратная косая черта или символ кавычки. Строковые литералы могут опционально начинаться с буквы 'r' или 'R'; такие строки называются сырыми строками и используют другие правила интерпретации escape-последовательностей с обратной косой чертой. Префикс 'u' или 'U' превращает строку в строку Unicode. Строки Unicode используют набор символов Unicode, определенный консорциумом Unicode и ISO 10646. Некоторые дополнительные escape-последовательности, описанные ниже, доступны в строках Unicode. Префикс 'b' или 'B' в Python 2 игнорируется; он указывает, что литерал должен стать байтовым литералом в Python 3 (например, при автоматическом преобразовании кода с помощью 2to3). За префиксом 'u' или 'b' может следовать префикс 'r'.

В строках с тройными кавычками допускаются неэкранированные переводы строк и кавычки (они сохраняются), за исключением того, что три неэкранированные кавычки подряд завершают строку. (Под «кавычкой» понимается символ, которым открывается строка, то есть либо ', либо ".)

Если не указан префикс 'r' или 'R', escape-последовательности в строках интерпретируются по правилам, аналогичным используемым в Standard C. Распознаваемые escape-последовательности:

Escape-последовательность

Значение

Примечания

\newline

Игнорируется

\\

Обратная косая черта (\)

\'

Одинарная кавычка (')

\"

Двойная кавычка (")

\a

ASCII Звонок (BEL)

\b

ASCII Забой (BS)

\f

ASCII Перевод страницы (FF)

\n

ASCII Перевод строки (LF)

\N{name}

Символ с именем name в базе данных Unicode (только Unicode)

\r

ASCII Возврат каретки (CR)

\t

ASCII горизонтальная табуляция (TAB)

\uxxxx

Символ с 16-битным шестнадцатеричным значением xxxx (только Unicode)

(1)

\Uxxxxxxxx

Символ с 32-битным шестнадцатеричным значением xxxxxxxx (только Unicode)

(2)

\v

ASCII вертикальная табуляция (VT)

\ooo

Символ с восьмеричным значением ooo

(3,5)

\xhh

Символ с шестнадцатеричным значением hh

(4,5)

Примечания:

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

  2. Любой символ Unicode может быть закодирован таким образом, но символы за пределами Основной многоязычной плоскости (BMP) будут кодироваться с использованием суррогатной пары, если Python скомпилирован для использования 16-битных кодовых единиц (по умолчанию).

  3. Как и в стандарте C, допускается до трёх восьмеричных цифр.

  4. В отличие от стандартного C, требуется ровно две шестнадцатеричные цифры.

  5. В строковом литерале шестнадцатеричные и восьмеричные escape-последовательности обозначают байт с заданным значением; не обязательно, чтобы байт кодировал символ в исходной кодировке. В литерале Unicode эти escape-последовательности обозначают символ Unicode с заданным значением.

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

Когда присутствует префикс 'r' или 'R', символ, следующий за обратной косой чертой, включается в строку без изменений, и все обратные косые черты остаются в строке. Например, строковый литерал r"\n" состоит из двух символов: обратной косой черты и строчной 'n'. Кавычки строки могут быть экранированы обратной косой чертой, но обратная косая черта остается в строке; например, r"\"" – это допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; r"\" не является допустимым строковым литералом (даже сырая строка не может заканчиваться нечетным количеством обратных косых черт). В частности, сырая строка не может заканчиваться одной обратной косой чертой (поскольку обратная косая черта экранировала бы следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа в составе строки, а не как продолжение строки.

Когда префикс 'r' или 'R' используется вместе с префиксом 'u' или 'U', то escape-последовательности \uXXXX и \UXXXXXXXX обрабатываются, а все остальные обратные косые черты остаются в строке. Например, строковый литерал ur"\u0062\n" состоит из трех символов Unicode: «LATIN SMALL LETTER B», «REVERSE SOLIDUS» и «LATIN SMALL LETTER N». Обратные косые черты могут быть экранированы предшествующей обратной косой чертой; однако обе остаются в строке. В результате escape-последовательности \uXXXX распознаются только при нечетном количестве обратных косых черт.

2.4.2. Конкатенация строковых литераловString literal concatenation

Допускается использование нескольких смежных строковых литералов (разделенных пробелами), возможно, с разными соглашениями о кавычках, и их значение эквивалентно их конкатенации. Таким образом, "hello" 'world' эквивалентно "helloworld". Эту возможность можно использовать для уменьшения количества необходимых обратных косых черт, удобного разбиения длинных строк на строки или даже для добавления комментариев к частям строк, например:

re.compile("[A-Za-z_]"       # буква или подчёркивание
           "[A-Za-z0-9_]*"   # буква, цифра или подчёркивание
          )

Обратите внимание, что эта возможность определяется на синтаксическом уровне, но реализуется на этапе компиляции. Оператор '+' должен использоваться для конкатенации строковых выражений во время выполнения. Также обратите внимание, что при конкатенации литералов для каждого компонента можно использовать разные стили кавычек (в том числе смешивать сырые строки и строки в тройных кавычках).

2.4.3. Числовые литералыNumeric literals

Существует четыре типа числовых литералов: обычные целые числа, длинные целые числа, числа с плавающей точкой и мнимые числа. Комплексных литералов нет (комплексные числа можно получить сложением действительного и мнимого чисел).

Обратите внимание, что числовые литералы не включают знак; конструкция вида -1 на самом деле является выражением, состоящим из унарного оператора ‘-‘ и литерала 1.

2.4.4. Литералы целых и длинных целых чиселInteger and long integer literals

Литералы целых и длинных целых чисел описываются следующими лексическими определениями:

longinteger    ::=  integer ("l" | "L")
integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+
hexinteger     ::=  "0" ("x" | "X") hexdigit+
bininteger     ::=  "0" ("b" | "B") bindigit+
nonzerodigit   ::=  "1"..."9"
octdigit       ::=  "0"..."7"
bindigit       ::=  "0" | "1"
hexdigit       ::=  digit | "a"..."f" | "A"..."F"

Хотя в качестве суффикса для длинных целых чисел допускаются как строчная 'l', так и прописная 'L', настоятельно рекомендуется всегда использовать 'L', так как буква 'l' слишком похожа на цифру '1'.

Литералы обычных целых чисел, превышающие наибольшее представимое обычное целое (например, 2147483647 при 32-битной арифметике), воспринимаются так, как если бы они были литералами длинных целых. 1 Для литералов длинных целых нет иных ограничений, кроме доступного объёма памяти.

Несколько примеров литералов обычных целых (первая строка) и литералов длинных целых (вторая и третья строки):

7     2147483647                        0177
3L    79228162514264337593543950336L    0377L   0x100000000L
      79228162514264337593543950336             0xdeadbeef

2.4.5. Литералы с плавающей запятойFloating point literals

Литералы с плавающей запятой описываются следующими лексическими определениями:

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

Обратите внимание, что целая часть и порядок чисел с плавающей точкой могут выглядеть как восьмеричные целые, но интерпретируются по основанию 10. Например, 077e010 допустимо и обозначает то же число, что и 77e10. Допустимый диапазон литералов с плавающей точкой зависит от реализации. Некоторые примеры литералов с плавающей точкой:

3.14    10.    .001    1e100    3.14e-10    0e0

Обратите внимание, что числовые литералы не включают знак; конструкция вида -1 на самом деле является выражением, состоящим из унарного оператора - и литерала 1.

2.4.6. Мнимые литералыImaginary literals

Мнимые литералы описываются следующими лексическими определениями:

imagnumber ::=  (floatnumber | intpart) ("j" | "J")

Мнимый литерал даёт комплексное число с действительной частью 0.0. Комплексные числа представляются в виде пары чисел с плавающей запятой и имеют те же ограничения по диапазону. Чтобы создать комплексное число с ненулевой действительной частью, добавьте к нему число с плавающей запятой, например, (3+4j). Некоторые примеры мнимых литералов:

3.14j   10.j    10j     .001j   1e100j  3.14e-10j

2.5. ОператорыOperators

Следующие токены являются операторами:

+       -       *       **      /       //      %
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=      <>

Операторы сравнения <> и != – это два варианта записи одного и того же оператора. != – предпочтительное написание; <> устарело.

2.6. РазделителиDelimiters

Следующие токены служат разделителями в грамматике:

(       )       [       ]       {       }      @
,       :       .       `       =       ;
+=      -=      *=      /=      //=     %=
&=      |=      ^=      >>=     <<=     **=

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

Следующие печатные ASCII-символы имеют специальное значение как часть других токенов или иным образом значимы для лексического анализатора:

'       "       #       \

Следующие печатные ASCII-символы не используются в Python. Их появление вне строковых литералов и комментариев является безусловной ошибкой:

$       ?

Сноски

1

В версиях Python до 2.4 восьмеричные и шестнадцатеричные литералы, значение которых находилось чуть выше наибольшего представимого обычного целого, но меньше наибольшего 32-битного числа без знака (на машине с 32-битной арифметикой), равного 4294967296, воспринимались как отрицательное обычное целое, полученное вычитанием 4294967296 из их значения без знака.