The Python Language Reference / Справочник по языку Python: 2. Lexical analysis
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
2. Лексический анализ simba87 01.04.10 в 10:59 |
|
|
Python воспринимает текст программы как набор символов Юникода. Кодировка по умолчанию - UTF-8 (см. PEP 3120), но также может быть выбрана и другая кодировка. Если исходный файл не может быть декодирован, то это приводит к возникновению синтаксической ошибки - SyntaxError. simba87 01.04.10 в 11:08 |
||
|
2.1. Структура последовательностей simba87 01.04.10 в 11:11 2.1. Структура строк Hittih 17.07.10 в 17:29 |
||
|
2.1.1. Логические последовательности simba87 01.04.10 в 11:27 2.1.1. Условные строки Hittih 18.07.10 в 01:44 |
||
|
2.1.2. Физические строки simba87 01.04.10 в 11:32 |
||
|
При реализации Python строки исходного кода должны передаваться API Python'а с использованием стандартных соглашений C о символах новой строки (символ \n является ASCII LF - символом окончания строки). vanderloos 01.07.10 в 09:18 При встраивании Питона в другое приложение, строки исходного кода на Питоне следует передавать из этого приложения в API Питона, следуя стандартным соглашениям языка "C" для символов новой строки (тоесть, символ "\n" , обозначающий ASCII LF ). Hittih 04.07.10 в 13:17 |
||
|
2.1.3. Комментарии simba87 01.04.10 в 15:39 2.1.3. Комментарии Hittih 20.07.10 в 07:14 |
||
|
2.1.4. Объявление кодировки simba87 01.04.10 в 15:44 2.1.4. Объявление кодировки vanderloos 01.07.10 в 09:26 |
||
|
# -*- coding: -*- vanderloos 01.07.10 в 09:27 |
||
|
понимаемое также GNU Emacs, и vanderloos 01.07.10 в 09:28 понимаемое также GNU Emacs, и vanderloos 01.07.10 в 09:29 |
||
|
# vim:fileencoding= vanderloos 01.07.10 в 09:29 |
||
|
используемое в VIM Брэма Мооленаара (Bram Moolenaar) vanderloos 01.07.10 в 09:31 |
||
|
Если объявление кодировки отсутствует, кодировкой по умолчанию считается UTF-8. К тому же, если первые байты файла соответствуют отметке байтового порядка UTF-8 (b'\xef\xbb\xbf'), объявленной кодировкой является UTF-8 (поддерживается, например, в Microsoft notepad (блокнот)). vanderloos 01.07.10 в 09:36 |
||
|
Если кодировка объявлена, ее имя должно быть понято Python. Кодировка используется для лексического анализа, включая строковые литералы, комментрии и идентификаторы. Объявление кодировки должно быть в отдельной строке. vanderloos 01.07.10 в 09:42 |
||
|
2.1.5. Явное объединение строк vanderloos 01.07.10 в 10:31 2.1.5. Явное объединение строк Hittih 22.08.10 в 11:58 |
||
|
if 1900 < year < 2100 and 1 <= month <= 12 \ vanderloos 01.07.10 в 10:33 if 1900 < year < 2100 and 1 <= month <= 12 \ Hittih 22.08.10 в 12:02 |
||
|
Строка, которая заканчиваэтся бэкслешем, не может содержать комментарий. Бэкслеш не продолжает комментарий. Бэкслеш не продолжает лексемы (токены), кроме строковых литералов (т.е. токены, не являющиеся строковыми литералами, не могут быть разделены на строки с помощью бэкслеша). Бэкслеш недопустим в строке во всех других случаях вне строковых литералов. vanderloos 01.07.10 в 10:43 Строка, оканчивающаяся бэкслэшем, не может содержать комментарий. Комментарий или другую лексему кроме текстовых данных, начатые на одной строке, нельзя продолжить с помощью бэкслэша на другой строке. Кроме конца физической строки бэкслэш допустим только внутри текстовых данных. Hittih 07.07.10 в 08:17 |
||
|
2.1.6. Неявное объединение строк vanderloos 01.07.10 в 10:48 2.1.6. Неявное объединение строк Hittih 07.07.10 в 08:21 |
||
|
month_names = ['Januari', 'Februari', 'Maart', # Это голландские vanderloos 01.07.10 в 10:49 |
||
|
Неявно продолженные строки могут содержать комментарии. Отступы не играют роли в продолженных строках. При продолжении разрешены пустые строки. Токена NEWLINE нет в неявно продолженных строках. Строки в тройных скобках (см. ниже) также могут быть неявно продолженными, в этом случае они не могут содержать комментарий. vanderloos 01.07.10 в 10:57 |
||
|
2.1.7. Пустые последовательности vanderloos 01.07.10 в 11:11 2.1.7. Пустые строки Hittih 22.08.10 в 12:32 |
||
|
2.1.8. Отступы vanderloos 01.07.10 в 11:21 |
||
|
Знаки табуляции заменяются (слева напрво) по одному на восемь пробелов так, что общее число символов после замены кратно восьми (здесь использовано то же правило, что и в Unix). Общее число знаков перед первым непустым символом определяет отступ строки. Отступ не может быть разделен между многими физическими строками с помощью бэкслеша; знаки пробела и табуляции до первого бэкслеша определяют отступ. vanderloos 02.07.10 в 09:05 |
||
|
Отступы отклоняются как противоречивые, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется "TabError" . Hittih 04.07.10 в 12:08 Отступы не принимаются из-за противоречивости, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется «TabError» . Hittih 22.08.10 в 12:45 |
||
|
Замечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на не-UNIX платформах - не следует использовать смесь пробелов и табуляций для отступов в одном исодном файле. Также следует отметить, что различные платформы могут явно ограничивать максимальный уровень отступов. Hittih 04.07.10 в 12:45 |
||
|
Символ перевода страницы может находится в начале строки, тогда он игнорируется при расчете отступов. В любом другом месте символ перевода страницы между пробелами в начале строки может обрабатываться неопределенным образом (например, может сбрасывать счетчик предыдущих пробелов до нуля). vanderloos 05.07.10 в 13:05 |
||
|
Уровни отступа строк используются для создания токенов INDENT (отступ) и DEDENT (конец отступа) при помощи стека, как описано ниже. vanderloos 05.07.10 в 13:13 |
||
|
Перед чтением первой строки файла в стек записывется значение 0, это значение никогда не удалится. Числа, заносимые в стек, будут сторого возрастать. В начале каждой логической строки уровень отступа сравнивается с максимальным значением стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается один токен INDENT. Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается токен DEDENT. В конце файла токены DEDENT создаются для всех оставшихся в стеке чисел больше нуля. vanderloos 05.07.10 в 14:35 Перед чтением первой строки файла в стек записывается значение «0», это значение никогда не будет извлечено. Числа, заносимые в стек, будут строго возрастать. В начале каждой условной строки уровень отступа сравнивается с максимальным значением на верху стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается одна лексема «INDENT». Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается лексема «DEDENT» . В конце файла лексемы «DEDENT» создаются для всех оставшихся в стеке чисел больше нуля. Hittih 22.08.10 в 13:01 |
||
|
Здесь приведен пример Python кода с правильно (но странновато) расставленными отступами: vanderloos 05.07.10 в 14:44 |
||
|
def perm(l): vanderloos 05.07.10 в 14:45 |
||
|
Следующий пример показывает различные ошибки в отступах: vanderloos 05.07.10 в 14:46 |
||
|
def perm(l): # Ошибка: отступ первой строки vanderloos 05.07.10 в 14:56 |
||
|
(Вообще-то, первые три ошибки найдены парсером, и только последняя - лексическим анализатором: уровень отступа return r не совпадает с уровнем в стеке.) vanderloos 05.07.10 в 15:07 |
||
|
2.1.9. Пробелы между токенами vanderloos 05.07.10 в 15:17 2.1.9. Пробелы между лексемами Hittih 22.08.10 в 13:16 |
||
|
2.2. Другие токены (лексемы) vanderloos 07.07.10 в 07:42 2.2. Другие лексемы Hittih 22.08.10 в 13:23 |
||
|
2.3. Идентификаторы и ключевые слова vanderloos 07.07.10 в 07:45 2.3. Идентификаторы и ключевые слова Hittih 22.08.10 в 13:35 |
||
|
Синтаксис идентификаторов в Python основывается на стандартном приложении к Unicode: UAX-31, с переработкой и изменениями описанными ниже, см. также PEP 3131 для более подробной информации. vanderloos 07.07.10 в 07:49 Синтаксис идентификаторов в Питоне основывается на приложении «UAX-31» к стандарту «Unicode» , с переработкой и изменениями описанными ниже. Также смотрите дополнительные детали в «PEP 3131» . Hittih 23.08.10 в 09:48 |
||
|
В ASCII диапазоне (U+0001..U+007F) для идентификаторов можно использовать те же символы, что и в Python 2.x: буквы от A до Z в вержнем и нижнем регистре, подчеркивание _ и цифры от 0 до 9, кроме первого символа идентификатора. vanderloos 07.07.10 в 07:55 В ASCII диапазоне (U+0001..U+007F) в идентификаторах допустимы только те же символы, что и в Питоне 2.x : буквы от «A» до «Z» в верхнем и нижнем регистре, подчеркивание «_» и, кроме первого символа идентификатора, – цифры от «0» до «9» . Hittih 23.08.10 в 10:01 |
||
|
В Python 3.0 представлены дополнительные символы, не входящие в ASCII диапазон (см. PEP 3131). Для этих символов использована классификация из версии базы символов Unicode (Unicode Character Database), включенная в модуль unicodedata. vanderloos 07.07.10 в 07:59 |
||
|
Идентификаторы не ограничены по длине и чувствительны к регистру. vanderloos 07.07.10 в 08:00 |
||
|
identifier ::= id_start id_continue* vanderloos 07.07.10 в 08:02 identifier ::= id_start id_continue* Hittih 23.08.10 в 10:22 |
||
|
Использованные выше категории Unicode: vanderloos 07.07.10 в 08:38 Использованные выше обозначения категорий Юникода : Hittih 23.08.10 в 10:43 |
||
|
* Lu - буквы в верхнем регистре vanderloos 07.07.10 в 09:02 |
||
|
Все идентификаторы конвертируются в форму нормализации NFC при лексическом разборе; сравнение идентификаторов основано на NFC. vanderloos 07.07.10 в 09:05 Все идентификаторы при лексическом разборе конвертируются в нормализованную форму NFC; и сравнение идентификаторов производится уже в форме NFC. Hittih 23.08.10 в 10:52 |
||
|
Ненормативный HTML файл со списком всех доступных символов для использования в идентификаторах для Unicode 4.1 представлен здесь: http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html. vanderloos 07.07.10 в 09:07 Ненормативный HTML файл со списком всех символов Юникода 4.1 , доступных для использования в идентификаторах, представлен здесь: http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html. Hittih 23.08.10 в 10:56 |
||
|
2.3.1. Ключевые слова vanderloos 07.07.10 в 09:10 |
||
|
False class finally is return vanderloos 07.07.10 в 09:10 |
||
|
2.3.2. Зарезервированные классы идентификаторов vanderloos 07.07.10 в 09:15 2.3.2. Зарезервированные классы идентификаторов Hittih 23.08.10 в 12:58 |
||
|
_* vanderloos 07.07.10 в 09:18 |
||
|
Не импортировать с помощью from module import *. Специальный идентификатор _ используется интерактивным интерпретатором для хранения результата последнего вычисления, хранится он в модуле builtins. Не в интерактивном режиме _ не имеет специального значения, неопределен. См. раздел "Объявление импорта". vanderloos 07.07.10 в 09:19 Не импортируются инструкцией «from module import *» . Специальный идентификатор «_» используется интерактивным интерпретатором для хранения результата последнего вычисления, хранится он в модуле «builtins» . Не в интерактивном режиме «_» не имеет специального значения, не определен. (Смотрите раздел «Объявление импорта» ) . Hittih 23.08.10 в 13:05 |
