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.3. Коментарі

Коментар починається з символу решетки (#), який не є частиною рядкового літералу, і закінчується в кінці фізичного рядка. Коментар означає кінець логічного рядка, якщо не викликаються неявні правила з’єднання рядків. Коментарі ігноруються синтаксисом.

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 для отримання додаткової інформації.

Within the ASCII range (U+0001..U+007F), the valid characters for identifiers include the uppercase and lowercase letters A through Z, the underscore _ and, except for the first character, the digits 0 through 9. Python 3.0 introduced additional characters from outside the ASCII range (see PEP 3131). For these characters, the classification uses the version of the Unicode Character Database as included in the unicodedata module.

Довжина ідентифікаторів необмежена. Справа знакова.

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 in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_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 15.0.0 can be found at https://www.unicode.org/Public/15.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. М’які ключові слова

Added in version 3.10.

Some identifiers are only reserved under specific contexts. These are known as soft keywords. The identifiers match, case, type and _ can syntactically act as keywords in certain contexts, but this distinction is done at the parser level, not when tokenizing.

As soft keywords, their use in the grammar is possible while still preserving compatibility with existing code that uses these names as identifier names.

match, case, and _ are used in the match statement. type is used in the type statement.

Змінено в версії 3.12: type is now a soft keyword.

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 give special meaning to otherwise ordinary characters like n, which means „newline“ when escaped (\n). It can also be used to escape characters that otherwise have a special meaning, such as newline, backslash itself, or the quote character. See escape sequences below for examples.

Байтові літерали завжди мають префікс 'b' або 'B'; вони створюють екземпляр типу bytes замість типу str. Вони можуть містити лише символи ASCII; байти з числовим значенням 128 або більше повинні бути виражені за допомогою екранованих символів.

Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such constructs are called raw string literals and raw bytes literals respectively and treat backslashes as literal characters. As a result, in raw string literals, '\U' and '\u' escapes are not treated specially.

Added in version 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. Розпізнаними керуючими послідовностями є:

Ескейп-послідовність

Значення

Примітки

\<newline>

Зворотна коса риска та новий рядок ігноруються

(1)

\\

Зворотна коса риска (\)

\''

Одинарні лапки (')

\"

Подвійні лапки (")

\a

ASCII Bell (BEL)

\b

ASCII Backspace (BS)

\f

ASCII Formfeed (FF)

\n

ASCII Linefeed (LF)

\r

ASCII повернення каретки (CR)

\t

Горизонтальна вкладка ASCII (TAB)

\v

Вертикальна вкладка ASCII (VT)

\ooo

Символ із вісімковим значенням ooo

(2,4)

\xhh

Символ із шістнадцятковим значенням hh

(3,4)

Екран-послідовності, розпізнані лише в рядкових літералах:

Ескейп-послідовність

Значення

Примітки

\N{name}

Символ із назвою name у базі даних Unicode

(5)

\uxxxx

Символ із 16-бітним шістнадцятковим значенням xxxx

(6)

\Uxxxxxxxx

Символ із 32-розрядним шістнадцятковим значенням xxxxxxx

(7)

Примітки:

  1. 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.

  2. Як і в стандарті C, допускається до трьох вісімкових цифр.

    Змінено в версії 3.11: Octal escapes with value larger than 0o377 produce a DeprecationWarning.

    Змінено в версії 3.12: Octal escapes with value larger than 0o377 produce a SyntaxWarning. In a future Python version they will be eventually a SyntaxError.

  3. На відміну від стандарту C, потрібні рівно дві шістнадцяткові цифри.

  4. У байтовому літералі шістнадцяткове та вісімкове екранування позначають байт із заданим значенням. У рядковому літералі ці екрановані символи позначають символ Unicode із заданим значенням.

  5. Змінено в версії 3.3: Додано підтримку псевдонімів [1].

  6. Потрібні рівно чотири шістнадцяткові цифри.

  7. Таким чином можна закодувати будь-який символ Unicode. Необхідно рівно вісім шістнадцяткових цифр.

На відміну від стандартного C, усі нерозпізнані керуючі послідовності залишаються в рядку без змін, тобто зворотний слеш залишається в результаті. (Ця поведінка корисна під час налагодження: якщо escape-послідовність введена неправильно, результат легше розпізнати як несправний.) Важливо також зазначити, що escape-послідовності, розпізнані лише в рядкових літералах, належать до категорії нерозпізнаних escape-сигналів для байтів. літерали.

Змінено в версії 3.6: Unrecognized escape sequences produce a DeprecationWarning.

Змінено в версії 3.12: Unrecognized escape sequences produce a SyntaxWarning. In a future Python version they will be 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

Added in version 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. Each expression is evaluated in the context where the formatted string literal appears, in order from left to right. Replacement expressions can contain newlines in both single-quoted and triple-quoted f-strings and they can contain comments. Everything that comes after a # inside a replacement field is a comment (even closing braces and quotes). In that case, replacement fields must be closed in a different line.

>>> f"abc{a # This is a comment }"
... + 3}"
'abc5'

Змінено в версії 3.7: До Python 3.7 вираз await і розуміння, що містять пропозицію async for, були незаконними у виразах у форматованих рядкових літералах через проблему з реалізацією.

Змінено в версії 3.12: Prior to Python 3.12, comments were not allowed inside f-string replacement fields.

Якщо вказано знак рівності '=', вихідні дані матимуть текст виразу, '=' і обчислене значення. Пробіли після відкриваючої фігурної дужки '{' у виразі та після '=' зберігаються у виводі. За замовчуванням '=' надає repr() виразу, якщо не вказано формат. Коли вказано формат, за замовчуванням використовується str() виразу, якщо не оголошено перетворення '!r''.

Added in version 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" '

Reusing the outer f-string quoting type inside a replacement field is permitted:

>>> a = dict(x=2)
>>> f"abc {a["x"]} def"
'abc 2 def'

Змінено в версії 3.12: Prior to Python 3.12, reuse of the same quoting type of the outer f-string inside a replacement field was not possible.

Backslashes are also allowed in replacement fields and are evaluated the same way as in any other context:

>>> a = ["a", "b", "c"]
>>> print(f"List a contains:\n{"\n".join(a)}")
List a contains:
a
b
c

Змінено в версії 3.12: Prior to Python 3.12, backslashes were not permitted inside an f-string replacement field.

Відформатовані рядкові літерали не можна використовувати як рядки документації, навіть якщо вони не містять виразів.

>>> 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. Їх поява поза рядковими літералами та коментарями є безумовною помилкою:

$       ?       `

Виноски