2. Лексичний аналіз¶
Програма Python читається парсером. Вхідними даними для аналізатора є потік токенів, згенерованих лексичним аналізатором. У цьому розділі описано, як лексичний аналізатор розбиває файл на токени.
Python читає текст програми як кодові точки Unicode; кодування вихідного файлу може бути задано декларацією кодування та за замовчуванням UTF-8, подробиці див. PEP 3120. Якщо вихідний файл не може бути декодований, виникає SyntaxError
.
2.1. Лінійна структура¶
Програма Python розділена на кілька логічних рядків.
2.1.1. Логічні лінії¶
Кінець логічного рядка представлено маркером NEWLINE. Інструкції не можуть перетинати межі логічного рядка, за винятком випадків, коли синтаксис дозволяє NEWLINE (наприклад, між операторами в складених операторах). Логічна лінія складається з однієї або кількох фізичних ліній за дотриманням явних або неявних правил об’єднання ліній.
2.1.2. Фізичні лінії¶
Фізичний рядок — це послідовність символів, що завершується послідовністю в кінці рядка. У вихідних файлах і рядках можна використовувати будь-яку зі стандартних послідовностей завершення рядків платформи – форму Unix із використанням ASCII LF (переведення рядка), форму Windows із використанням послідовності ASCII CR LF (повернення з наступним переходом рядка) або стару форму Macintosh із використанням символ ASCII CR (повернення). Усі ці форми можна використовувати однаково, незалежно від платформи. Кінець введення також служить неявним термінатором для останнього фізичного рядка.
Під час вбудовування Python рядки вихідного коду слід передавати в API Python, використовуючи стандартні угоди C для символів нового рядка (символ \n
, що представляє ASCII LF, є символом закінчення рядка).
2.1.4. Оголошення кодування¶
Якщо коментар у першому чи другому рядку сценарію Python відповідає регулярному виразу coding[=:]\s*([-\w.]+)
, цей коментар обробляється як оголошення кодування; перша група цього виразу називає кодування файлу вихідного коду. Оголошення кодування має з’являтися в окремому рядку. Якщо це другий рядок, перший рядок також має бути рядком лише для коментарів. Рекомендовані форми виразу кодування:
# -*- coding: <encoding-name> -*-
який також розпізнається GNU Emacs і
# vim:fileencoding=<encoding-name>
який розпізнається VIM Брема Муленаара.
If no encoding declaration is found, the default encoding is UTF-8. If the implicit or explicit encoding of a file is UTF-8, an initial UTF-8 byte-order mark (b“xefxbbxbf“) is ignored rather than being a syntax error.
Якщо оголошено кодування, Python має розпізнавати назву кодування (див. Стандартні кодування). Кодування використовується для всього лексичного аналізу, включаючи рядкові літерали, коментарі та ідентифікатори.
2.1.5. Явне з’єднання рядків¶
Два або більше фізичних рядків можна об’єднати в логічні рядки за допомогою символів зворотної похилої риски (\
), таким чином: коли фізичний рядок закінчується зворотною похилою рискою, яка не є частиною рядкового літералу чи коментаря, він об’єднується за допомогою наступного: утворюючи один логічний рядок, видаляючи зворотну косу риску та наступний символ кінця рядка. Наприклад:
if 1900 < year < 2100 and 1 <= month <= 12 \
and 1 <= day <= 31 and 0 <= hour < 24 \
and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date
return 1
Рядок, який закінчується зворотною скісною рискою, не може містити коментаря. Зворотна коса риска не продовжує коментар. Зворотний слеш не продовжує лексему, за винятком рядкових літералів (тобто лексеми, окрім рядкових літералів, не можна розділити на фізичні рядки за допомогою зворотної похилої риски). Зворотний слеш неприпустимий в іншому місці рядка за межами рядкового літералу.
2.1.6. Неявне з’єднання ліній¶
Вирази в дужках, квадратних або фігурних дужках можна розділити на кілька фізичних рядків без використання зворотних скісних риск. Наприклад:
month_names = ['Januari', 'Februari', 'Maart', # These are the
'April', 'Mei', 'Juni', # Dutch names
'Juli', 'Augustus', 'September', # for the months
'Oktober', 'November', 'December'] # of the year
Неявно продовжені рядки можуть містити коментарі. Відступ рядків продовження не важливий. Допускаються порожні рядки продовження. Немає маркера NEWLINE між рядками неявного продовження. Неявно продовжені рядки також можуть зустрічатися в рядках із потрійними лапками (див. нижче); у цьому випадку вони не можуть нести коментарі.
2.1.7. Порожні рядки¶
Логічний рядок, який містить лише пробіли, табуляції, канали форми та, можливо, коментар, ігнорується (тобто маркер NEWLINE не генерується). Під час інтерактивного введення операторів обробка порожнього рядка може відрізнятися залежно від реалізації циклу читання-оцінки-друку. У стандартному інтерактивному інтерпретаторі повністю порожній логічний рядок (тобто такий, що не містить навіть пробілів або коментаря) завершує багаторядковий оператор.
2.1.8. Відступ¶
Пробіли (пробіли та табуляції) на початку логічного рядка використовуються для обчислення рівня відступу рядка, який, у свою чергу, використовується для визначення групування операторів.
Табуляції замінюються (зліва направо) на один-вісім пробілів, щоб загальна кількість символів до заміни включно була кратною восьми (це те саме правило, яке використовується в Unix). Тоді загальна кількість пробілів перед першим символом, що не є пробілом, визначає відступ рядка. Відступи не можна розділити на кілька фізичних рядків за допомогою зворотної косої риски; пробіл до першої зворотної скісної риски визначає відступ.
Відступи відхиляються як непослідовні, якщо вихідний файл змішує табуляції та пробіли таким чином, що робить значення залежним від цінності табуляції в пробілах; У цьому випадку виникає TabError
.
Примітка щодо крос-платформної сумісності: через характер текстових редакторів на платформах, відмінних від UNIX, нерозумно використовувати суміш пробілів і табуляції для відступу в одному вихідному файлі. Слід також зазначити, що різні платформи можуть явно обмежувати максимальний рівень відступу.
Символ переходу форми може бути присутнім на початку рядка; він буде проігнорований для обчислень відступів вище. Символи передачі форми, що зустрічаються в інших місцях у першому пробілі, мають невизначений ефект (наприклад, вони можуть скинути кількість пробілів до нуля).
Рівні відступів послідовних рядків використовуються для створення токенів INDENT і DEDENT за допомогою стека, як показано нижче.
Перш ніж буде зчитано перший рядок файлу, у стек вставляється один нуль; це ніколи більше не вискочить. Числа в стеку завжди суворо зростатимуть знизу вгору. На початку кожного логічного рядка рівень відступу рядка порівнюється з верхньою частиною стека. Якщо воно рівне, нічого не відбувається. Якщо він більший, він поміщається в стек і генерується один токен INDENT. Якщо воно менше, воно повинно бути одним із чисел, які зустрічаються в стеку; усі номери зі стеку, які є більшими, вилучаються, і для кожного числа, що виривається, генерується маркер DEDENT. У кінці файлу генерується маркер DEDENT для кожного числа, що залишилося в стеку і є більшим за нуль.
Ось приклад правильного (хоча і заплутаного) фрагмента коду Python з відступом:
def perm(l):
# Compute the list of all permutations of 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): # error: first line indented
for i in range(len(l)): # error: not indented
s = l[:i] + l[i+1:]
p = perm(l[:i] + l[i+1:]) # error: unexpected indent
for x in p:
r.append(l[i:i+1] + x)
return r # error: inconsistent dedent
(Насправді, перші три помилки виявляються синтаксичним аналізатором; лише остання помилка знаходить лексичний аналізатор — відступ return r
не відповідає рівню, витягненому зі стеку.)
2.1.9. Пробіли між маркерами¶
За винятком початку логічного рядка або в рядкових літералах, символи пропуску, символи табуляції та переходу форми можуть використовуватися як взаємозамінні для розділення токенів. Пробіл потрібен між двома лексемами, лише якщо їх конкатенація інакше може бути інтерпретована як інша лексема (наприклад, ab — одна лексема, а b — це дві лексеми).
2.2. Інші жетони¶
Окрім NEWLINE, INDENT і DEDENT, існують такі категорії токенів: ідентифікатори, ключові слова, літерали, оператори та роздільники. Пробільні символи (окрім символів закінчення рядків, які обговорювалися раніше) не є маркерами, але служать для розмежування маркерів. Якщо існує неоднозначність, токен містить найдовший можливий рядок, який утворює законний токен, коли читається зліва направо.
2.3. Ідентифікатори та ключові слова¶
Ідентифікатори (також згадувані як імена) описуються наступними лексичними визначеннями.
Синтаксис ідентифікаторів у Python базується на стандартному додатку Unicode UAX-31 із уточненнями та змінами, як визначено нижче; див. також PEP 3131 для отримання додаткової інформації.
У діапазоні ASCII (U+0001..U+007F) дійсні символи для ідентифікаторів такі ж, як і в Python 2.x: великі та малі літери від A
до Z
, символ підкреслення _
і, за винятком першого символу, цифри 0
до 9
.
Python 3.0 представляє додаткові символи поза межами діапазону ASCII (див. PEP 3131). Для цих символів у класифікації використовується версія бази даних символів Unicode, яка включена в модуль unicodedata
.
Довжина ідентифікаторів необмежена. Справа знакова.
identifier ::=xid_start
xid_continue
* id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property> id_continue ::= <all characters inid_start
, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property> xid_start ::= <all characters inid_start
whose NFKC normalization is in "id_start xid_continue*"> xid_continue ::= <all characters inid_continue
whose NFKC normalization is in "id_continue*">
Зазначені вище коди категорій Unicode означають:
Lu - великі літери
Ll - малі літери
Lt - заголовні літери
Lm - літери-модифікатори
Lo - інші букви
Nl - цифри літер
Mn - непробільні знаки
Mc - знаки поєднання інтервалів
Nd - десяткові числа
Pc - розділові знаки сполучника
Other_ID_Start - explicit list of characters in PropList.txt to support backwards compatibility
Other_ID_Continue - так само
Під час синтаксичного аналізу всі ідентифікатори перетворюються в нормальну форму NFKC; порівняння ідентифікаторів базується на NFKC.
A non-normative HTML file listing all valid identifier characters for Unicode 14.0.0 can be found at https://www.unicode.org/Public/14.0.0/ucd/DerivedCoreProperties.txt
2.3.1. Ключові слова¶
Наступні ідентифікатори використовуються як зарезервовані слова або ключові слова мови, і їх не можна використовувати як звичайні ідентифікатори. Вони мають бути написані точно так, як тут написано:
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
2.3.2. М’які ключові слова¶
Нове в версії 3.10.
Some identifiers are only reserved under specific contexts. These are known as
soft keywords. The identifiers match
, case
and _
can
syntactically act as keywords in contexts related to the pattern matching
statement, but this distinction is done at the parser level, not when
tokenizing.
As soft keywords, their use with pattern matching is possible while still
preserving compatibility with existing code that uses match
, case
and _
as
identifier names.
2.3.3. Зарезервовані класи ідентифікаторів¶
Певні класи ідентифікаторів (крім ключових слів) мають спеціальні значення. Ці класи ідентифікуються шаблонами початкових і кінцевих символів підкреслення:
_*
Не імпортовано
з імпорту модуля *
._
У шаблоні
case
в операторіmatch
,_
є м’яким ключовим словом, яке позначає знак підстановки.Окремо інтерактивний інтерпретатор робить результат останньої оцінки доступним у змінній
_
. (Він зберігається в модуліbuiltins
разом із вбудованими функціями, такими якprint
.)В інших місцях
_
є звичайним ідентифікатором. Його часто використовують для назви «особливих» елементів, але це не є особливим для самого Python.Примітка
Назва
_
часто використовується в поєднанні з інтернаціоналізацією; зверніться до документації для модуляgettext
для отримання додаткової інформації про цю угоду.Він також зазвичай використовується для невикористаних змінних.
__*__
Імена, визначені системою, неофіційно відомі як імена «дундерів». Ці імена визначаються інтерпретатором і його реалізацією (включаючи стандартну бібліотеку). Поточні назви систем обговорюються в розділі Назви спеціальних методів та в інших місцях. Більше можливо буде визначено в майбутніх версіях Python. Будь-яке використання імен
__*__
у будь-якому контексті, яке не відповідає явно задокументованому використанню, може бути порушено без попередження.__*
Приватні імена класів. Імена в цій категорії, якщо вони використовуються в контексті визначення класу, переписуються, щоб використовувати спотворену форму, щоб уникнути зіткнень імен між «приватними» атрибутами базового та похідних класів. Дивіться розділ Ідентифікатори (імена).
2.4. Літерали¶
Літерали — це позначення постійних значень деяких вбудованих типів.
2.4.1. Рядкові та байтові літерали¶
Рядкові літерали описуються такими лексичними визначеннями:
stringliteral ::= [stringprefix
](shortstring
|longstring
) stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F" | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" shortstring ::= "'"shortstringitem
* "'" | '"'shortstringitem
* '"' longstring ::= "'''"longstringitem
* "'''" | '"""'longstringitem
* '"""' shortstringitem ::=shortstringchar
|stringescapeseq
longstringitem ::=longstringchar
|stringescapeseq
shortstringchar ::= <any source character except "\" or newline or the quote> longstringchar ::= <any source character except "\"> stringescapeseq ::= "\" <any source character>
bytesliteral ::=bytesprefix
(shortbytes
|longbytes
) bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes ::= "'"shortbytesitem
* "'" | '"'shortbytesitem
* '"' longbytes ::= "'''"longbytesitem
* "'''" | '"""'longbytesitem
* '"""' shortbytesitem ::=shortbyteschar
|bytesescapeseq
longbytesitem ::=longbyteschar
|bytesescapeseq
shortbyteschar ::= <any ASCII character except "\" or newline or the quote> longbyteschar ::= <any ASCII character except "\"> bytesescapeseq ::= "\" <any ASCII character>
Одне синтаксичне обмеження, яке не вказується цими продуктами, полягає в тому, що пробіли не допускаються між stringprefix
або bytesprefix
та рештою літералу. Вихідний набір символів визначається оголошенням кодування; це UTF-8, якщо у вихідному файлі не вказано кодування; див. розділ Оголошення кодування.
In plain English: Both types of literals can be enclosed in matching single quotes
('
) or double quotes ("
). They can also be enclosed in matching groups
of three single or double quotes (these are generally referred to as
triple-quoted strings). The backslash (\
) character is used to escape
characters that otherwise have a special meaning, such as newline, backslash
itself, or the quote character.
Байтові літерали завжди мають префікс 'b'
або 'B'
; вони створюють екземпляр типу bytes
замість типу str
. Вони можуть містити лише символи ASCII; байти з числовим значенням 128 або більше повинні бути виражені за допомогою екранованих символів.
Both string and bytes literals may optionally be prefixed with a letter 'r'
or 'R'
; such strings are called raw strings and treat backslashes as
literal characters. As a result, in string literals, '\U'
and '\u'
escapes in raw strings are not treated specially. Given that Python 2.x’s raw
unicode literals behave differently than Python 3.x’s the 'ur'
syntax
is not supported.
Нове в версії 3.3: Префікс 'rb
до літералів із необробленими байтами було додано як синонім 'br'
.
Підтримку застарілого літералу Unicode (u'value
) було знову запроваджено для спрощення обслуговування подвійних кодових баз Python 2.x і 3.x. Перегляньте PEP 414 для отримання додаткової інформації.
Рядковий літерал із 'f''
або 'F''
у своєму префіксі є formatted string literal; див. f-strings. 'f'
можна поєднувати з 'r'
, але не з 'b''
або 'u''
, тому можливі необроблені форматовані рядки, але форматовані байтові літерали не є.
У літералах із потрійними лапками дозволені (і зберігаються) неекрановані нові рядки та лапки, за винятком того, що три неекрановані лапки поспіль завершують літерал. («Лапка» - це символ, який використовується для відкриття літералу, тобто '
або "
.)
2.4.1.1. Escape sequences¶
Якщо немає префікса 'r'
або 'R'
, керуючі послідовності в рядкових і байтових літералах інтерпретуються відповідно до правил, подібних до тих, що використовуються стандартом C. Розпізнаними керуючими послідовностями є:
Ескейп-послідовність |
Значення |
Примітки |
---|---|---|
|
Зворотна коса риска та новий рядок ігноруються |
(1) |
|
Зворотна коса риска ( |
|
|
Одинарні лапки ( |
|
|
Подвійні лапки ( |
|
|
ASCII Bell (BEL) |
|
|
ASCII Backspace (BS) |
|
|
ASCII Formfeed (FF) |
|
|
ASCII Linefeed (LF) |
|
|
ASCII повернення каретки (CR) |
|
|
Горизонтальна вкладка ASCII (TAB) |
|
|
Вертикальна вкладка ASCII (VT) |
|
|
Символ із вісімковим значенням ooo |
(2,4) |
|
Символ із шістнадцятковим значенням hh |
(3,4) |
Екран-послідовності, розпізнані лише в рядкових літералах:
Ескейп-послідовність |
Значення |
Примітки |
---|---|---|
|
Символ із назвою name у базі даних Unicode |
(5) |
|
Символ із 16-бітним шістнадцятковим значенням xxxx |
(6) |
|
Символ із 32-розрядним шістнадцятковим значенням xxxxxxx |
(7) |
Примітки:
A backslash can be added at the end of a line to ignore the newline:
>>> 'This string will not include \ ... backslashes or newline characters.' 'This string will not include backslashes or newline characters.'
The same result can be achieved using triple-quoted strings, or parentheses and string literal concatenation.
Як і в стандарті C, допускається до трьох вісімкових цифр.
Змінено в версії 3.11: Octal escapes with value larger than
0o377
produce aDeprecationWarning
. In a future Python version they will be aSyntaxWarning
and eventually aSyntaxError
.На відміну від стандарту C, потрібні рівно дві шістнадцяткові цифри.
У байтовому літералі шістнадцяткове та вісімкове екранування позначають байт із заданим значенням. У рядковому літералі ці екрановані символи позначають символ Unicode із заданим значенням.
Змінено в версії 3.3: Додано підтримку псевдонімів [1].
Потрібні рівно чотири шістнадцяткові цифри.
Таким чином можна закодувати будь-який символ Unicode. Необхідно рівно вісім шістнадцяткових цифр.
На відміну від стандартного C, усі нерозпізнані керуючі послідовності залишаються в рядку без змін, тобто зворотний слеш залишається в результаті. (Ця поведінка корисна під час налагодження: якщо escape-послідовність введена неправильно, результат легше розпізнати як несправний.) Важливо також зазначити, що escape-послідовності, розпізнані лише в рядкових літералах, належать до категорії нерозпізнаних escape-сигналів для байтів. літерали.
Змінено в версії 3.6: Unrecognized escape sequences produce a DeprecationWarning
. In
a future Python version they will be a SyntaxWarning
and
eventually a SyntaxError
.
Навіть у необробленому літералі лапки можна екранувати за допомогою зворотної косої риски, але зворотна коса риска залишається в результаті; наприклад, r"\""
є дійсним рядковим літералом, що складається з двох символів: зворотної косої риски та подвійних лапок; r"\"
не є дійсним рядковим літералом (навіть необроблений рядок не може закінчуватися у непарній кількості зворотних скісних рисок). Зокрема, необроблений літерал не може закінчуватися однією зворотною скісною рискою (оскільки зворотна скісна риска виключатиме наступний символ лапок). Зауважте також, що одна зворотна скісна риска, за якою йде новий рядок, інтерпретується як ці два символи як частина літералу, не як продовження рядка.
2.4.2. Конкатенація рядкового літералу¶
Кілька суміжних рядкових або байтових літералів (розмежованих пробілами), можливо, з використанням різних угод про цитування, дозволено, і їхнє значення таке ж, як і їх об’єднання. Таким чином, "hello" 'world'
еквівалентно "helloworld"
. Цю функцію можна використати, щоб зменшити кількість потрібних зворотних похилих рис, щоб зручно розділити довгі рядки на довгі рядки або навіть додати коментарі до частин рядків, наприклад:
re.compile("[A-Za-z_]" # letter or underscore
"[A-Za-z0-9_]*" # letter, digit or underscore
)
Зауважте, що ця функція визначена на синтаксичному рівні, але реалізована під час компіляції. Для об’єднання рядкових виразів під час виконання необхідно використовувати оператор «+». Також зауважте, що конкатенація літералів може використовувати різні стилі лапок для кожного компонента (навіть змішування необроблених рядків і рядків у потрійних лапках), а форматовані рядкові літерали можуть бути об’єднані з простими рядковими літералами.
2.4.3. f-strings¶
Нове в версії 3.6.
formatted string literal або f-string — це рядковий літерал, який має префікс 'f'
або 'F'
. Ці рядки можуть містити поля заміни, які є виразами, розділеними фігурними дужками {}
. Хоча інші рядкові літерали завжди мають постійне значення, форматовані рядки насправді є виразами, які обчислюються під час виконання.
Екран-послідовності декодуються як у звичайних рядкових літералах (за винятком випадків, коли літерал також позначено як необроблений рядок). Після декодування граматика вмісту рядка така:
f_string ::= (literal_char
| "{{" | "}}" |replacement_field
)* replacement_field ::= "{"f_expression
["="] ["!"conversion
] [":"format_spec
] "}" f_expression ::= (conditional_expression
| "*"or_expr
) (","conditional_expression
| "," "*"or_expr
)* [","] |yield_expression
conversion ::= "s" | "r" | "a" format_spec ::= (literal_char
|replacement_field
)* literal_char ::= <any code point except "{", "}" or NULL>
Частини рядка поза фігурними дужками трактуються буквально, за винятком того, що будь-які подвоєні фігурні дужки '{{'
або '}}'
замінюються відповідною одинарною фігурною дужкою. Одна відкривна фігурна дужка '{'
позначає поле заміни, яке починається з виразу Python. Щоб відобразити як текст виразу, так і його значення після оцінки (корисно під час налагодження), після виразу можна додати знак рівності '='
. Поле перетворення, введене знаком оклику '!'
може слідувати за ним. Специфікатор формату також може бути доданий двокрапкою ':''
. Поле заміни закінчується фігурною дужкою, що закривається, '}''
.
Expressions in formatted string literals are treated like regular
Python expressions surrounded by parentheses, with a few exceptions.
An empty expression is not allowed, and both lambda
and
assignment expressions :=
must be surrounded by explicit parentheses.
Replacement expressions can contain line breaks (e.g. in triple-quoted
strings), but they cannot contain comments. Each expression is evaluated
in the context where the formatted string literal appears, in order from
left to right.
Змінено в версії 3.7: До Python 3.7 вираз await
і розуміння, що містять пропозицію async for
, були незаконними у виразах у форматованих рядкових літералах через проблему з реалізацією.
Якщо вказано знак рівності '='
, вихідні дані матимуть текст виразу, '='
і обчислене значення. Пробіли після відкриваючої фігурної дужки '{'
у виразі та після '='
зберігаються у виводі. За замовчуванням '='
надає repr()
виразу, якщо не вказано формат. Коли вказано формат, за замовчуванням використовується str()
виразу, якщо не оголошено перетворення '!r''
.
Нове в версії 3.8: Знак рівності '='
.
Якщо вказано перетворення, результат обчислення виразу перетворюється перед форматуванням. Перетворення '!s'
викликає str()
результату, '!r''
викликає repr()
, а '!a'
викликає ascii()
.
The result is then formatted using the format()
protocol. The
format specifier is passed to the __format__()
method of the
expression or conversion result. An empty string is passed when the
format specifier is omitted. The formatted result is then included in
the final value of the whole string.
Top-level format specifiers may include nested replacement fields. These nested
fields may include their own conversion fields and format specifiers, but may not include more deeply nested replacement fields. The
format specifier mini-language is the same as that used by
the str.format()
method.
Відформатовані рядкові літерали можуть бути об’єднані, але поля заміни не можуть бути розділені на літерали.
Деякі приклади відформатованих рядкових літералів:
>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is 'Fred'."
>>> f"He said his name is {repr(name)}." # repr() is equivalent to !r
"He said his name is 'Fred'."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
>>> today = datetime(year=2017, month=1, day=27)
>>> f"{today:%B %d, %Y}" # using date format specifier
'January 27, 2017'
>>> f"{today=:%B %d, %Y}" # using date format specifier and debugging
'today=January 27, 2017'
>>> number = 1024
>>> f"{number:#0x}" # using integer format specifier
'0x400'
>>> foo = "bar"
>>> f"{ foo = }" # preserves whitespace
" foo = 'bar'"
>>> line = "The mill's closed"
>>> f"{line = }"
'line = "The mill\'s closed"'
>>> f"{line = :20}"
"line = The mill's closed "
>>> f"{line = !r:20}"
'line = "The mill\'s closed" '
A consequence of sharing the same syntax as regular string literals is that characters in the replacement fields must not conflict with the quoting used in the outer formatted string literal:
f"abc {a["x"]} def" # error: outer string literal ended prematurely
f"abc {a['x']} def" # workaround: use different quoting
Backslashes are not allowed in format expressions and will raise an error:
f"newline: {ord('\n')}" # raises SyntaxError
To include a value in which a backslash escape is required, create a temporary variable.
>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'
Відформатовані рядкові літерали не можна використовувати як рядки документації, навіть якщо вони не містять виразів.
>>> def foo():
... f"Not a docstring"
...
>>> foo.__doc__ is None
True
Дивіться також PEP 498 для пропозиції, яка додала відформатовані рядкові літерали, і str.format()
, який використовує пов’язаний механізм форматування рядків.
2.4.4. Числові літерали¶
There are three types of numeric literals: integers, floating point numbers, and imaginary numbers. There are no complex literals (complex numbers can be formed by adding a real number and an imaginary number).
Зауважте, що числові літерали не містять знака; така фраза, як -1
, насправді є виразом, що складається з унарного оператора „-
“ і літерала 1
.
2.4.5. Цілі літерали¶
Цілі літерали описуються такими лексичними визначеннями:
integer ::=decinteger
|bininteger
|octinteger
|hexinteger
decinteger ::=nonzerodigit
(["_"]digit
)* | "0"+ (["_"] "0")* bininteger ::= "0" ("b" | "B") (["_"]bindigit
)+ octinteger ::= "0" ("o" | "O") (["_"]octdigit
)+ hexinteger ::= "0" ("x" | "X") (["_"]hexdigit
)+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" bindigit ::= "0" | "1" octdigit ::= "0"..."7" hexdigit ::=digit
| "a"..."f" | "A"..."F"
Немає обмежень щодо довжини цілочисельних літералів, крім того, що може зберігатися у доступній пам’яті.
Підкреслення ігноруються для визначення числового значення літералу. Їх можна використовувати для групування цифр для кращої читабельності. Одне підкреслення може бути між цифрами та після основних специфікаторів, таких як 0x
.
Зауважте, що нулі на початку ненульового десяткового числа не допускаються. Це для усунення неоднозначності з вісімковими літералами у стилі C, які Python використовував до версії 3.0.
Деякі приклади цілих літералів:
7 2147483647 0o177 0b100110111
3 79228162514264337593543950336 0o377 0xdeadbeef
100_000_000_000 0b_1110_0101
Змінено в версії 3.6: Підкреслення тепер дозволено для цілей групування в літералах.
2.4.6. Floating point literals¶
Floating point literals are described by the following lexical definitions:
floatnumber ::=pointfloat
|exponentfloat
pointfloat ::= [digitpart
]fraction
|digitpart
"." exponentfloat ::= (digitpart
|pointfloat
)exponent
digitpart ::=digit
(["_"]digit
)* fraction ::= "."digitpart
exponent ::= ("e" | "E") ["+" | "-"]digitpart
Note that the integer and exponent parts are always interpreted using radix 10.
For example, 077e010
is legal, and denotes the same number as 77e10
. The
allowed range of floating point literals is implementation-dependent. As in
integer literals, underscores are supported for digit grouping.
Some examples of floating point literals:
3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93
Змінено в версії 3.6: Підкреслення тепер дозволено для цілей групування в літералах.
2.4.7. Уявні літерали¶
Уявні літерали описуються такими лексичними визначеннями:
imagnumber ::= (floatnumber
|digitpart
) ("j" | "J")
An imaginary literal yields a complex number with a real part of 0.0. Complex
numbers are represented as a pair of floating point numbers and have the same
restrictions on their range. To create a complex number with a nonzero real
part, add a floating point number to it, e.g., (3+4j)
. Some examples of
imaginary literals:
3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j
2.5. Оператори¶
Наступні токени є операторами:
+ - * ** / // % @
<< >> & | ^ ~ :=
< > <= >= == !=
2.6. Роздільники¶
Наступні лексеми служать роздільниками в граматиці:
( ) [ ] { }
, : . ; @ = ->
+= -= *= /= //= %= @=
&= |= ^= >>= <<= **=
Крапка також може зустрічатися в літералах із плаваючою комою та уявних літералах. Послідовність із трьох періодів має особливе значення як літерали еліпсису. Друга половина списку, розширені оператори присвоєння, лексично служать роздільниками, але також виконують операції.
Наступні друковані символи ASCII мають спеціальне значення як частина інших токенів або іншим чином важливі для лексичного аналізатора:
' " # \
Наступні друковані символи ASCII не використовуються в Python. Їх поява поза рядковими літералами та коментарями є безумовною помилкою:
$ ? `
Виноски
2.1.3. Коментарі¶
Коментар починається з символу решетки (
#
), який не є частиною рядкового літералу, і закінчується в кінці фізичного рядка. Коментар означає кінець логічного рядка, якщо не викликаються неявні правила з’єднання рядків. Коментарі ігноруються синтаксисом.