
.. _lexical:

****************
Lexical analysis
****************

.. index:: lexical analysis, parser, token

A Python program is read by a *parser*.  Input to the parser is a stream of
:term:`tokens <token>`, generated by the *lexical analyzer* (also known as
the *tokenizer*).
This chapter describes how the lexical analyzer produces these tokens.

The lexical analyzer determines the program text's :ref:`encoding <encodings>`
(UTF-8 by default), and decodes the text into
:ref:`source characters <lexical-source-character>`.
If the text cannot be decoded, a :exc:`SyntaxError` is raised.

Next, the lexical analyzer uses the source characters to generate a stream of tokens.
The type of a generated token generally depends on the next source character to
be processed. Similarly, other special behavior of the analyzer depends on
the first source character that hasn't yet been processed.
The following table gives a quick summary of these source characters,
with links to sections that contain more information.

.. list-table::
   :header-rows: 1

   * - Character
     - Next token (or other relevant documentation)

   * - * space
       * tab
       * formfeed
     - * :ref:`Whitespace <whitespace>`

   * - * CR, LF
     - * :ref:`New line <line-structure>`
       * :ref:`Indentation <indentation>`

   * - * backslash (``\``)
     - * :ref:`Explicit line joining <explicit-joining>`
       * (Also significant in :ref:`string escape sequences <escape-sequences>`)

   * - * hash (``#``)
     - * :ref:`Comment <comments>`

   * - * quote (``'``, ``"``)
     - * :ref:`String literal <strings>`

   * - * ASCII letter (``a``-``z``, ``A``-``Z``)
       * non-ASCII character
     - * :ref:`Name <identifiers>`
       * Prefixed :ref:`string or bytes literal <strings>`

   * - * underscore (``_``)
     - * :ref:`Name <identifiers>`
       * (Can also be part of :ref:`numeric literals <numbers>`)

   * - * number (``0``-``9``)
     - * :ref:`Numeric literal <numbers>`

   * - * dot (``.``)
     - * :ref:`Numeric literal <numbers>`
       * :ref:`Operator <operators>`

   * - * question mark (``?``)
       * dollar (``$``)
       *
         .. (the following uses zero-width space characters to render
         .. a literal backquote)

         backquote (``​`​``)
       * control character
     - * Error (outside string literals and comments)

   * - * other printing character
     - * :ref:`Operator or delimiter <operators>`

   * - * end of file
     - * :ref:`End marker <endmarker-token>`


.. _line-structure:

Line structure
==============

.. index:: line structure

A Python program is divided into a number of *logical lines*.


.. _logical-lines:

Logical lines
-------------

.. index:: logical line, physical line, line joining, NEWLINE token

The end of a logical line is represented by the token :data:`~token.NEWLINE`.
Statements cannot cross logical line boundaries except where :data:`!NEWLINE`
is allowed by the syntax (e.g., between statements in compound statements).
A logical line is constructed from one or more *physical lines* by following
the :ref:`explicit <explicit-joining>` or :ref:`implicit <implicit-joining>`
*line joining* rules.


.. _physical-lines:

Physical lines
--------------

A physical line is a sequence of characters terminated by one the following
end-of-line sequences:

* the Unix form using ASCII LF (linefeed),
* the Windows form using the ASCII sequence CR LF (return followed by linefeed),
* the '`Classic Mac OS`__' form using the ASCII CR (return) character.

  __ https://en.wikipedia.org/wiki/Classic_Mac_OS

Regardless of platform, each of these sequences is replaced by a single
ASCII LF (linefeed) character.
(This is done even inside :ref:`string literals <strings>`.)
Each line can use any of the sequences; they do not need to be consistent
within a file.

The end of input also serves as an implicit terminator for the final
physical line.

Formally:

.. grammar-snippet::
   :group: python-grammar

   newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR>


.. _comments:

Comments
--------

.. index:: comment, hash character
   single: # (hash); comment

A comment starts with a hash character (``#``) that is not part of a string
literal, and ends at the end of the physical line.  A comment signifies the end
of the logical line unless the implicit line joining rules are invoked. Comments
are ignored by the syntax.


.. _encodings:

Encoding declarations
---------------------

.. index:: source character set, encoding declarations (source file)
   single: # (hash); source encoding declaration

If a comment in the first or second line of the Python script matches the
regular expression ``coding[=:]\s*([-\w.]+)``, this comment is processed as an
encoding declaration; the first group of this expression names the encoding of
the source code file. The encoding declaration must appear on a line of its
own. If it is the second line, the first line must also be a comment-only line.
The recommended forms of an encoding expression are ::

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

which is recognized also by GNU Emacs, and ::

   # vim:fileencoding=<encoding-name>

which is recognized by Bram Moolenaar's 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'\xef\xbb\xbf'``) is ignored rather than being a syntax error.

If an encoding is declared, the encoding name must be recognized by Python
(see :ref:`standard-encodings`). The
encoding is used for all lexical analysis, including string literals, comments
and identifiers.

.. _lexical-source-character:

All lexical analysis, including string literals, comments
and identifiers, works on Unicode text decoded using the source encoding.
Any Unicode code point, except the NUL control character, can appear in
Python source.

.. grammar-snippet::
   :group: python-grammar

   source_character:  <any Unicode code point, except NUL>


.. _explicit-joining:

Explicit line joining
---------------------

.. index:: physical line, line joining, line continuation, backslash character

Two or more physical lines may be joined into logical lines using backslash
characters (``\``), as follows: when a physical line ends in a backslash that is
not part of a string literal or comment, it is joined with the following forming
a single logical line, deleting the backslash and the following end-of-line
character.  For example::

   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

A line ending in a backslash cannot carry a comment.  A backslash does not
continue a comment.  A backslash does not continue a token except for string
literals (i.e., tokens other than string literals cannot be split across
physical lines using a backslash).  A backslash is illegal elsewhere on a line
outside a string literal.


.. _implicit-joining:

Implicit line joining
---------------------

Expressions in parentheses, square brackets or curly braces can be split over
more than one physical line without using backslashes. For example::

   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

Implicitly continued lines can carry comments.  The indentation of the
continuation lines is not important.  Blank continuation lines are allowed.
There is no NEWLINE token between implicit continuation lines.  Implicitly
continued lines can also occur within triple-quoted strings (see below); in that
case they cannot carry comments.


.. _blank-lines:

Blank lines
-----------

.. index:: single: blank line

A logical line that contains only spaces, tabs, formfeeds and possibly a
comment, is ignored (i.e., no :data:`~token.NEWLINE` token is generated).
During interactive input of statements, handling of a blank line may differ
depending on the implementation of the read-eval-print loop.
In the standard interactive interpreter, an entirely blank logical line (that
is, one containing not even whitespace or a comment) terminates a multi-line
statement.


.. _indentation:

Indentation
-----------

.. index:: indentation, leading whitespace, space, tab, grouping, statement grouping

Leading whitespace (spaces and tabs) at the beginning of a logical line is used
to compute the indentation level of the line, which in turn is used to determine
the grouping of statements.

Tabs are replaced (from left to right) by one to eight spaces such that the
total number of characters up to and including the replacement is a multiple of
eight (this is intended to be the same rule as used by Unix).  The total number
of spaces preceding the first non-blank character then determines the line's
indentation.  Indentation cannot be split over multiple physical lines using
backslashes; the whitespace up to the first backslash determines the
indentation.

Indentation is rejected as inconsistent if a source file mixes tabs and spaces
in a way that makes the meaning dependent on the worth of a tab in spaces; a
:exc:`TabError` is raised in that case.

**Cross-platform compatibility note:** because of the nature of text editors on
non-UNIX platforms, it is unwise to use a mixture of spaces and tabs for the
indentation in a single source file.  It should also be noted that different
platforms may explicitly limit the maximum indentation level.

A formfeed character may be present at the start of the line; it will be ignored
for the indentation calculations above.  Formfeed characters occurring elsewhere
in the leading whitespace have an undefined effect (for instance, they may reset
the space count to zero).

.. index:: INDENT token, DEDENT token

The indentation levels of consecutive lines are used to generate
:data:`~token.INDENT` and :data:`~token.DEDENT` tokens, using a stack,
as follows.

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 :data:`!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 :data:`!DEDENT` token is generated.
At the end of the file, a :data:`!DEDENT` token is generated for each number
remaining on the stack that is larger than zero.

Here is an example of a correctly (though confusingly) indented piece of Python
code::

   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

The following example shows various indentation errors::

    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

(Actually, the first three errors are detected by the parser; only the last
error is found by the lexical analyzer --- the indentation of ``return r`` does
not match a level popped off the stack.)


.. _whitespace:

Whitespace between tokens
-------------------------

Except at the beginning of a logical line or in string literals, the whitespace
characters space, tab and formfeed can be used interchangeably to separate
tokens:

.. grammar-snippet::
   :group: python-grammar

   whitespace:  ' ' | tab | formfeed


Whitespace is needed between two tokens only if their concatenation
could otherwise be interpreted as a different token. For example, ``ab`` is one
token, but ``a b`` is two tokens. However, ``+a`` and ``+ a`` both produce
two tokens, ``+`` and ``a``, as ``+a`` is not a valid token.


.. _endmarker-token:

End marker
----------

At the end of non-interactive input, the lexical analyzer generates an
:data:`~token.ENDMARKER` token.


.. _other-tokens:

Other tokens
============

Besides :data:`~token.NEWLINE`, :data:`~token.INDENT` and :data:`~token.DEDENT`,
the following categories of tokens exist:
*identifiers* and *keywords* (:data:`~token.NAME`), *literals* (such as
:data:`~token.NUMBER` and :data:`~token.STRING`), and other symbols
(*operators* and *delimiters*, :data:`~token.OP`).
Whitespace characters (other than logical 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.


.. _identifiers:

Names (identifiers and keywords)
================================

.. index:: identifier, name

:data:`~token.NAME` tokens represent *identifiers*, *keywords*, and
*soft keywords*.

Names are composed of the following characters:

* uppercase and lowercase letters (``A-Z`` and ``a-z``),
* the underscore (``_``),
* digits (``0`` through ``9``), which cannot appear as the first character, and
* non-ASCII characters. Valid names may only contain "letter-like" and
  "digit-like" characters; see :ref:`lexical-names-nonascii` for details.

Names must contain at least one character, but have no upper length limit.
Case is significant.

Formally, names are described by the following lexical definitions:

.. grammar-snippet::
   :group: python-grammar

   NAME:          `name_start` `name_continue`*
   name_start:    "a"..."z" | "A"..."Z" | "_" | <non-ASCII character>
   name_continue: name_start | "0"..."9"
   identifier:    <`NAME`, except keywords>

Note that not all names matched by this grammar are valid; see
:ref:`lexical-names-nonascii` for details.


.. _keywords:

Keywords
--------

.. index::
   single: keyword
   single: reserved word

The following names 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:

.. sourcecode:: text

   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


.. _soft-keywords:

Soft Keywords
-------------

.. index:: soft keyword, keyword

.. versionadded:: 3.10

Some names are only reserved under specific contexts. These are known as
*soft keywords*:

- ``match``, ``case``, and ``_``, when used in the :keyword:`match` statement.
- ``type``, when used in the :keyword:`type` statement.

These syntactically act as keywords in their specific 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.

.. versionchanged:: 3.12
   ``type`` is now a soft keyword.

.. index::
   single: _, identifiers
   single: __, identifiers
.. _id-classes:

Reserved classes of identifiers
-------------------------------

Certain classes of identifiers (besides keywords) have special meanings.  These
classes are identified by the patterns of leading and trailing underscore
characters:

``_*``
   Not imported by ``from module import *``.

``_``
   In a ``case`` pattern within a :keyword:`match` statement, ``_`` is a
   :ref:`soft keyword <soft-keywords>` that denotes a
   :ref:`wildcard <wildcard-patterns>`.

   Separately, the interactive interpreter makes the result of the last evaluation
   available in the variable ``_``.
   (It is stored in the :mod:`builtins` module, alongside built-in
   functions like ``print``.)

   Elsewhere, ``_`` is a regular identifier. It is often used to name
   "special" items, but it is not special to Python itself.

   .. note::

      The name ``_`` is often used in conjunction with internationalization;
      refer to the documentation for the :mod:`gettext` module for more
      information on this convention.

      It is also commonly used for unused variables.

``__*__``
   System-defined names, informally known as "dunder" names. These names are
   defined by the interpreter and its implementation (including the standard library).
   Current system names are discussed in the :ref:`specialnames` section and elsewhere.
   More will likely be defined in future versions of Python.  *Any* use of ``__*__`` names,
   in any context, that does not follow explicitly documented use, is subject to
   breakage without warning.

``__*``
   Class-private names.  Names in this category, when used within the context of a
   class definition, are re-written to use a mangled form to help avoid name
   clashes between "private" attributes of base and derived classes. See section
   :ref:`atom-identifiers`.


.. _lexical-names-nonascii:

Non-ASCII characters in names
-----------------------------

Names that contain non-ASCII characters need additional normalization
and validation beyond the rules and grammar explained
:ref:`above <identifiers>`.
For example, ``ř_1``, ``蛇``, or ``साँप``  are valid names, but ``r〰2``,
``€``, or ``🐍`` are not.

This section explains the exact rules.

All names are converted into the `normalization form`_ NFKC while parsing.
This means that, for example, some typographic variants of characters are
converted to their "basic" form. For example, ``ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ`` normalizes to
``finalization``, so Python treats them as the same name::

   >>> ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3
   >>> finalization
   3

.. note::

   Normalization is done at the lexical level only.
   Run-time functions that take names as *strings* generally do not normalize
   their arguments.
   For example, the variable defined above is accessible at run time in the
   :func:`globals` dictionary as ``globals()["finalization"]`` but not
   ``globals()["ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ"]``.

Similarly to how ASCII-only names must contain only letters, digits and
the underscore, and cannot start with a digit, a valid name must
start with a character in the "letter-like" set ``xid_start``,
and the remaining characters must be in the "letter- and digit-like" set
``xid_continue``.

These sets based on the *XID_Start* and *XID_Continue* sets as defined by the
Unicode standard annex `UAX-31`_.
Python's ``xid_start`` additionally includes the underscore (``_``).
Note that Python does not necessarily conform to `UAX-31`_.

A non-normative listing of characters in the *XID_Start* and *XID_Continue*
sets as defined by Unicode is available in the `DerivedCoreProperties.txt`_
file in the Unicode Character Database.
For reference, the construction rules for the ``xid_*`` sets are given below.

The set ``id_start`` is defined as the union of:

* Unicode category ``<Lu>`` - uppercase letters (includes ``A`` to ``Z``)
* Unicode category ``<Ll>`` - lowercase letters (includes ``a`` to ``z``)
* Unicode category ``<Lt>`` - titlecase letters
* Unicode category ``<Lm>`` - modifier letters
* Unicode category ``<Lo>`` - other letters
* Unicode category ``<Nl>`` - letter numbers
* {``"_"``} - the underscore
* ``<Other_ID_Start>`` - an explicit set of characters in `PropList.txt`_
  to support backwards compatibility

The set ``xid_start`` then closes this set under NFKC normalization, by
removing all characters whose normalization is not of the form
``id_start id_continue*``.

The set ``id_continue`` is defined as the union of:

* ``id_start`` (see above)
* Unicode category ``<Nd>`` - decimal numbers (includes ``0`` to ``9``)
* Unicode category ``<Pc>`` - connector punctuations
* Unicode category ``<Mn>`` - nonspacing marks
* Unicode category ``<Mc>`` - spacing combining marks
* ``<Other_ID_Continue>`` - another explicit set of characters in
  `PropList.txt`_ to support backwards compatibility

Again, ``xid_continue`` closes this set under NFKC normalization.

Unicode categories use the version of the Unicode Character Database as
included in the :mod:`unicodedata` module.

.. _UAX-31: https://www.unicode.org/reports/tr31/
.. _PropList.txt: https://www.unicode.org/Public/17.0.0/ucd/PropList.txt
.. _DerivedCoreProperties.txt: https://www.unicode.org/Public/17.0.0/ucd/DerivedCoreProperties.txt
.. _normalization form: https://www.unicode.org/reports/tr15/#Norm_Forms

.. seealso::

   * :pep:`3131` -- Supporting Non-ASCII Identifiers
   * :pep:`672` -- Unicode-related Security Considerations for Python


.. _literals:

Literals
========

.. index:: literal, constant

Literals are notations for constant values of some built-in types.

In terms of lexical analysis, Python has :ref:`string, bytes <strings>`
and :ref:`numeric <numbers>` literals.

Other "literals" are lexically denoted using :ref:`keywords <keywords>`
(``None``, ``True``, ``False``) and the special
:ref:`ellipsis token <lexical-ellipsis>` (``...``).


.. index:: string literal, bytes literal, ASCII
   single: ' (single quote); string literal
   single: " (double quote); string literal
.. _strings:

String and Bytes literals
=========================

String literals are text enclosed in single quotes (``'``) or double
quotes (``"``). For example:

.. code-block:: python

   "spam"
   'eggs'

The quote used to start the literal also terminates it, so a string literal
can only contain the other quote (except with escape sequences, see below).
For example:

.. code-block:: python

   'Say "Hello", please.'
   "Don't do that!"

Except for this limitation, the choice of quote character (``'`` or ``"``)
does not affect how the literal is parsed.

Inside a string literal, the backslash (``\``) character introduces an
:dfn:`escape sequence`, which has special meaning depending on the character
after the backslash.
For example, ``\"`` denotes the double quote character, and does *not* end
the string:

.. code-block:: pycon

   >>> print("Say \"Hello\" to everyone!")
   Say "Hello" to everyone!

See :ref:`escape sequences <escape-sequences>` below for a full list of such
sequences, and more details.


.. index:: triple-quoted string
   single: """; string literal
   single: '''; string literal

Triple-quoted strings
---------------------

Strings can also be enclosed in matching groups of three single or double
quotes.
These are generally referred to as :dfn:`triple-quoted strings`::

   """This is a triple-quoted string."""

In triple-quoted literals, unescaped quotes are allowed (and are
retained), except that three unescaped quotes in a row terminate the literal,
if they are of the same kind (``'`` or ``"``) used at the start::

   """This string has "quotes" inside."""

Unescaped newlines are also allowed and retained::

   '''This triple-quoted string
   continues on the next line.'''


.. index::
   single: u'; string literal
   single: u"; string literal

String prefixes
---------------

String literals can have an optional :dfn:`prefix` that influences how the
content of the literal is parsed, for example:

.. code-block:: python

   b"data"
   f'{result=}'

The allowed prefixes are:

* ``b``: :ref:`Bytes literal <bytes-literal>`
* ``r``: :ref:`Raw string <raw-strings>`
* ``f``: :ref:`Formatted string literal <f-strings>` ("f-string")
* ``t``: :ref:`Template string literal <t-strings>` ("t-string")
* ``u``: No effect (allowed for backwards compatibility)

See the linked sections for details on each type.

Prefixes are case-insensitive (for example, '``B``' works the same as '``b``').
The '``r``' prefix can be combined with '``f``', '``t``' or '``b``', so '``fr``',
'``rf``', '``tr``', '``rt``', '``br``', and '``rb``' are also valid prefixes.

.. versionadded:: 3.3
   The ``'rb'`` prefix of raw bytes literals has been added as a synonym
   of ``'br'``.

   Support for the unicode legacy literal (``u'value'``) was reintroduced
   to simplify the maintenance of dual Python 2.x and 3.x codebases.
   See :pep:`414` for more information.


Formal grammar
--------------

String literals, except :ref:`"f-strings" <f-strings>` and
:ref:`"t-strings" <t-strings>`, are described by the
following lexical definitions.

These definitions use :ref:`negative lookaheads <lexical-lookaheads>` (``!``)
to indicate that an ending quote ends the literal.

.. grammar-snippet::
   :group: python-grammar

   STRING:          [`stringprefix`] (`stringcontent`)
   stringprefix:    <("r" | "u" | "b" | "br" | "rb"), case-insensitive>
   stringcontent:
      | "'''" ( !"'''" `longstringitem`)* "'''"
      | '"""' ( !'"""' `longstringitem`)* '"""'
      | "'" ( !"'" `stringitem`)* "'"
      | '"' ( !'"' `stringitem`)* '"'
   stringitem:      `stringchar` | `stringescapeseq`
   stringchar:      <any `source_character`, except backslash and newline>
   longstringitem:  `stringitem` | newline
   stringescapeseq: "\" <any `source_character`>

Note that as in all lexical definitions, whitespace is significant.
In particular, the prefix (if any) must be immediately followed by the starting
quote.

.. index:: physical line, escape sequence, Standard C, C
   single: \ (backslash); escape sequence
   single: \\; escape sequence
   single: \a; escape sequence
   single: \b; escape sequence
   single: \f; escape sequence
   single: \n; escape sequence
   single: \r; escape sequence
   single: \t; escape sequence
   single: \v; escape sequence
   single: \x; escape sequence
   single: \N; escape sequence
   single: \u; escape sequence
   single: \U; escape sequence

.. _escape-sequences:

Escape sequences
----------------

Unless an '``r``' or '``R``' prefix is present, escape sequences in string and
bytes literals are interpreted according to rules similar to those used by
Standard C.  The recognized escape sequences are:

.. list-table::
   :widths: auto
   :header-rows: 1

   * * Escape Sequence
     * Meaning
   * * ``\``\ <newline>
     * :ref:`string-escape-ignore`
   * * ``\\``
     * :ref:`Backslash <string-escape-escaped-char>`
   * * ``\'``
     * :ref:`Single quote <string-escape-escaped-char>`
   * * ``\"``
     * :ref:`Double quote <string-escape-escaped-char>`
   * * ``\a``
     * ASCII Bell (BEL)
   * * ``\b``
     * ASCII Backspace (BS)
   * * ``\f``
     * ASCII Formfeed (FF)
   * * ``\n``
     * ASCII Linefeed (LF)
   * * ``\r``
     * ASCII Carriage Return (CR)
   * * ``\t``
     * ASCII Horizontal Tab (TAB)
   * * ``\v``
     * ASCII Vertical Tab (VT)
   * * :samp:`\\\\{ooo}`
     * :ref:`string-escape-oct`
   * * :samp:`\\x{hh}`
     * :ref:`string-escape-hex`
   * * :samp:`\\N\\{{name}\\}`
     * :ref:`string-escape-named`
   * * :samp:`\\u{xxxx}`
     * :ref:`Hexadecimal Unicode character <string-escape-long-hex>`
   * * :samp:`\\U{xxxxxxxx}`
     * :ref:`Hexadecimal Unicode character <string-escape-long-hex>`

.. _string-escape-ignore:

Ignored end of line
^^^^^^^^^^^^^^^^^^^

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 :ref:`triple-quoted strings <strings>`,
or parentheses and :ref:`string literal concatenation <string-concatenation>`.

.. _string-escape-escaped-char:

Escaped characters
^^^^^^^^^^^^^^^^^^

To include a backslash in a non-:ref:`raw <raw-strings>` Python string
literal, it must be doubled. The ``\\`` escape sequence denotes a single
backslash character::

   >>> print('C:\\Program Files')
   C:\Program Files

Similarly, the ``\'`` and ``\"`` sequences denote the single and double
quote character, respectively::

   >>> print('\' and \"')
   ' and "

.. _string-escape-oct:

Octal character
^^^^^^^^^^^^^^^

The sequence :samp:`\\\\{ooo}` denotes a *character* with the octal (base 8)
value *ooo*::

   >>> '\120'
   'P'

Up to three octal digits (0 through 7) are accepted.

In a bytes literal, *character* means a *byte* with the given value.
In a string literal, it means a Unicode character with the given value.

.. versionchanged:: 3.11
   Octal escapes with value larger than ``0o377`` (255) produce a
   :exc:`DeprecationWarning`.

.. versionchanged:: 3.12
   Octal escapes with value larger than ``0o377`` (255) produce a
   :exc:`SyntaxWarning`.
   In a future Python version they will raise a :exc:`SyntaxError`.

.. _string-escape-hex:

Hexadecimal character
^^^^^^^^^^^^^^^^^^^^^

The sequence :samp:`\\x{hh}` denotes a *character* with the hex (base 16)
value *hh*::

   >>> '\x50'
   'P'

Unlike in Standard C, exactly two hex digits are required.

In a bytes literal, *character* means a *byte* with the given value.
In a string literal, it means a Unicode character with the given value.

.. _string-escape-named:

Named Unicode character
^^^^^^^^^^^^^^^^^^^^^^^

The sequence :samp:`\\N\\{{name}\\}` denotes a Unicode character
with the given *name*::

   >>> '\N{LATIN CAPITAL LETTER P}'
   'P'
   >>> '\N{SNAKE}'
   '🐍'

This sequence cannot appear in :ref:`bytes literals <bytes-literal>`.

.. versionchanged:: 3.3
   Support for `name aliases <https://www.unicode.org/Public/17.0.0/ucd/NameAliases.txt>`__
   has been added.

.. _string-escape-long-hex:

Hexadecimal Unicode characters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These sequences :samp:`\\u{xxxx}` and :samp:`\\U{xxxxxxxx}` denote the
Unicode character with the given hex (base 16) value.
Exactly four digits are required for ``\u``; exactly eight digits are
required for ``\U``.
The latter can encode any Unicode character.

.. code-block:: pycon

   >>> '\u1234'
   'ሴ'
   >>> '\U0001f40d'
   '🐍'

These sequences cannot appear in :ref:`bytes literals <bytes-literal>`.


.. index:: unrecognized escape sequence

Unrecognized escape sequences
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Unlike in Standard C, all unrecognized escape sequences are left in the string
unchanged, that is, *the backslash is left in the result*::

   >>> print('\q')
   \q
   >>> list('\q')
   ['\\', 'q']

Note that for bytes literals, the escape sequences only recognized in string
literals (``\N...``, ``\u...``, ``\U...``) fall into the category of
unrecognized escapes.

.. versionchanged:: 3.6
   Unrecognized escape sequences produce a :exc:`DeprecationWarning`.

.. versionchanged:: 3.12
   Unrecognized escape sequences produce a :exc:`SyntaxWarning`.
   In a future Python version they will raise a :exc:`SyntaxError`.


.. index::
   single: b'; bytes literal
   single: b"; bytes literal


.. _bytes-literal:

Bytes literals
--------------

:dfn:`Bytes literals` are always prefixed with '``b``' or '``B``'; they produce an
instance of the :class:`bytes` type instead of the :class:`str` type.
They may only contain ASCII characters; bytes with a numeric value of 128
or greater must be expressed with escape sequences (typically
:ref:`string-escape-hex` or :ref:`string-escape-oct`):

.. code-block:: pycon

   >>> b'\x89PNG\r\n\x1a\n'
   b'\x89PNG\r\n\x1a\n'
   >>> list(b'\x89PNG\r\n\x1a\n')
   [137, 80, 78, 71, 13, 10, 26, 10]

Similarly, a zero byte must be expressed using an escape sequence (typically
``\0`` or ``\x00``).


.. index::
   single: r'; raw string literal
   single: r"; raw string literal

.. _raw-strings:

Raw string literals
-------------------

Both string and bytes literals may optionally be prefixed with a letter '``r``'
or '``R``'; such constructs are called :dfn:`raw string literals`
and :dfn:`raw bytes literals` respectively and treat backslashes as
literal characters.
As a result, in raw string literals, :ref:`escape sequences <escape-sequences>`
are not treated specially:

.. code-block:: pycon

   >>> r'\d{4}-\d{2}-\d{2}'
   '\\d{4}-\\d{2}-\\d{2}'

Even in a raw literal, quotes can be escaped with a backslash, but the
backslash remains in the result; for example, ``r"\""`` is a valid string
literal consisting of two characters: a backslash and a double quote; ``r"\"``
is not a valid string literal (even a raw string cannot end in an odd number of
backslashes).  Specifically, *a raw literal cannot end in a single backslash*
(since the backslash would escape the following quote character).  Note also
that a single backslash followed by a newline is interpreted as those two
characters as part of the literal, *not* as a line continuation.


.. index::
   single: formatted string literal
   single: interpolated string literal
   single: string; formatted literal
   single: string; interpolated literal
   single: f-string
   single: fstring
   single: f'; formatted string literal
   single: f"; formatted string literal
   single: {} (curly brackets); in formatted string literal
   single: ! (exclamation); in formatted string literal
   single: : (colon); in formatted string literal
   single: = (equals); for help in debugging using string literals

.. _f-strings:
.. _formatted-string-literals:

f-strings
---------

.. versionadded:: 3.6
.. versionchanged:: 3.7
   The :keyword:`await` and :keyword:`async for` can be used in expressions
   within f-strings.
.. versionchanged:: 3.8
   Added the debug specifier (``=``)
.. versionchanged:: 3.12
   Many restrictions on expressions within f-strings have been removed.
   Notably, nested strings, comments, and backslashes are now permitted.

A :dfn:`formatted string literal` or :dfn:`f-string` is a string literal
that is prefixed with '``f``' or '``F``'.
Unlike other string literals, f-strings do not have a constant value.
They may contain *replacement fields* delimited by curly braces ``{}``.
Replacement fields contain expressions which are evaluated at run time.
For example::

   >>> who = 'nobody'
   >>> nationality = 'Spanish'
   >>> f'{who.title()} expects the {nationality} Inquisition!'
   'Nobody expects the Spanish Inquisition!'

Any doubled curly braces (``{{`` or ``}}``) outside replacement fields
are replaced with the corresponding single curly brace::

   >>> print(f'{{...}}')
   {...}

Other characters outside replacement fields are treated like in ordinary
string literals.
This means that escape sequences are decoded (except when a literal is
also marked as a raw string), and newlines are possible in triple-quoted
f-strings::

   >>> name = 'Galahad'
   >>> favorite_color = 'blue'
   >>> print(f'{name}:\t{favorite_color}')
   Galahad:       blue
   >>> print(rf"C:\Users\{name}")
   C:\Users\Galahad
   >>> print(f'''Three shall be the number of the counting
   ... and the number of the counting shall be three.''')
   Three shall be the number of the counting
   and the number of the counting shall be three.

Expressions in formatted string literals are treated like regular
Python expressions.
Each expression is evaluated in the context where the formatted string literal
appears, in order from left to right.
An empty expression is not allowed, and both :keyword:`lambda` and
assignment expressions ``:=`` must be surrounded by explicit parentheses::

   >>> f'{(half := 1/2)}, {half * 42}'
   '0.5, 21.0'

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'

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

It is possible to nest f-strings::

   >>> name = 'world'
   >>> f'Repeated:{f' hello {name}' * 3}'
   'Repeated: hello world hello world hello world'

Portable Python programs should not use more than 5 levels of nesting.

.. impl-detail::

   CPython does not limit nesting of f-strings.

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).
This means that replacement fields with comments must be closed in a
different line:

.. code-block:: text

   >>> a = 2
   >>> f"abc{a  # This comment  }"  continues until the end of the line
   ...       + 3}"
   'abc5'

After the expression, replacement fields may optionally contain:

* a *debug specifier* -- an equal sign (``=``), optionally surrounded by
  whitespace on one or both sides;
* a *conversion specifier* -- ``!s``, ``!r`` or ``!a``; and/or
* a *format specifier* prefixed with a colon (``:``).

See the :ref:`Standard Library section on f-strings <stdtypes-fstrings>`
for details on how these fields are evaluated.

As that section explains, *format specifiers* are passed as the second argument
to the :func:`format` function to format a replacement field value.
For example, they can be used to specify a field width and padding characters
using the :ref:`Format Specification Mini-Language <formatspec>`::

   >>> number = 14.3
   >>> f'{number:20.7f}'
   '          14.3000000'

Top-level format specifiers may include nested replacement fields::

   >>> field_size = 20
   >>> precision = 7
   >>> f'{number:{field_size}.{precision}f}'
   '          14.3000000'

These nested fields may include their own conversion fields and
:ref:`format specifiers <formatspec>`::

   >>> number = 3
   >>> f'{number:{field_size}}'
   '                   3'
   >>> f'{number:{field_size:05}}'
   '00000000000000000003'

However, these nested fields may not include more deeply nested replacement
fields.

Formatted string literals cannot be used as :term:`docstrings <docstring>`,
even if they do not include expressions::

   >>> def foo():
   ...     f"Not a docstring"
   ...
   >>> print(foo.__doc__)
   None

.. seealso::

   * :pep:`498` -- Literal String Interpolation
   * :pep:`701` -- Syntactic formalization of f-strings
   * :meth:`str.format`, which uses a related format string mechanism.


.. _t-strings:
.. _template-string-literals:

t-strings
---------

.. versionadded:: 3.14

A :dfn:`template string literal` or :dfn:`t-string` is a string literal
that is prefixed with '``t``' or '``T``'.
These strings follow the same syntax rules as
:ref:`formatted string literals <f-strings>`.
For differences in evaluation rules, see the
:ref:`Standard Library section on t-strings <stdtypes-tstrings>`


Formal grammar for f-strings
----------------------------

F-strings are handled partly by the :term:`lexical analyzer`, which produces the
tokens :py:data:`~token.FSTRING_START`, :py:data:`~token.FSTRING_MIDDLE`
and :py:data:`~token.FSTRING_END`, and partly by the parser, which handles
expressions in the replacement field.
The exact way the work is split is a CPython implementation detail.

Correspondingly, the f-string grammar is a mix of
:ref:`lexical and syntactic definitions <notation-lexical-vs-syntactic>`.

Whitespace is significant in these situations:

* There may be no whitespace in :py:data:`~token.FSTRING_START` (between
  the prefix and quote).
* Whitespace in :py:data:`~token.FSTRING_MIDDLE` is part of the literal
  string contents.
* In ``fstring_replacement_field``, if ``f_debug_specifier`` is present,
  all whitespace after the opening brace until the ``f_debug_specifier``,
  as well as whitespace immediately following ``f_debug_specifier``,
  is retained as part of the expression.

  .. impl-detail::

     The expression is not handled in the tokenization phase; it is
     retrieved from the source code using locations of the ``{`` token
     and the token after ``=``.


The ``FSTRING_MIDDLE`` definition uses
:ref:`negative lookaheads <lexical-lookaheads>` (``!``)
to indicate special characters (backslash, newline, ``{``, ``}``) and
sequences (``f_quote``).

.. grammar-snippet::
   :group: python-grammar

   fstring:    `FSTRING_START` `fstring_middle`* `FSTRING_END`

   FSTRING_START:      `fstringprefix` ("'" | '"' | "'''" | '"""')
   FSTRING_END:        `f_quote`
   fstringprefix:      <("f" | "fr" | "rf"), case-insensitive>
   f_debug_specifier:  '='
   f_quote:            <the quote character(s) used in FSTRING_START>

   fstring_middle:
      | `fstring_replacement_field`
      | `FSTRING_MIDDLE`
   FSTRING_MIDDLE:
      | (!"\" !`newline` !'{' !'}' !`f_quote`) `source_character`
      | `stringescapeseq`
      | "{{"
      | "}}"
      | <newline, in triple-quoted f-strings only>
   fstring_replacement_field:
      | '{' `f_expression` [`f_debug_specifier`] [`fstring_conversion`]
            [`fstring_full_format_spec`] '}'
   fstring_conversion:
      | "!" ("s" | "r" | "a")
   fstring_full_format_spec:
      | ':' `fstring_format_spec`*
   fstring_format_spec:
      | `FSTRING_MIDDLE`
      | `fstring_replacement_field`
   f_expression:
      | ','.(`conditional_expression` | "*" `or_expr`)+ [","]
      | `yield_expression`

.. note::

   In the above grammar snippet, the ``f_quote`` and ``FSTRING_MIDDLE`` rules
   are context-sensitive -- they depend on the contents of ``FSTRING_START``
   of the nearest enclosing ``fstring``.

   Constructing a more traditional formal grammar from this template is left
   as an exercise for the reader.

The grammar for t-strings is identical to the one for f-strings, with *t*
instead of *f* at the beginning of rule and token names and in the prefix.

.. grammar-snippet::
   :group: python-grammar

   tstring:    TSTRING_START tstring_middle* TSTRING_END

   <rest of the t-string grammar is omitted; see above>


.. _numbers:

Numeric literals
================

.. index:: number, numeric literal, integer literal
   floating-point literal, hexadecimal literal
   octal literal, binary literal, decimal literal, imaginary literal, complex literal

:data:`~token.NUMBER` tokens represent numeric literals, of which there are
three types: integers, floating-point numbers, and imaginary numbers.

.. grammar-snippet::
   :group: python-grammar

   NUMBER: `integer` | `floatnumber` | `imagnumber`

The numeric value of a numeric literal is the same as if it were passed as a
string to the :class:`int`, :class:`float` or :class:`complex` class
constructor, respectively.
Note that not all valid inputs for those constructors are also valid literals.

Numeric literals do not include a sign; a phrase like ``-1`` is
actually an expression composed of the unary operator '``-``' and the literal
``1``.


.. index::
   single: 0b; integer literal
   single: 0o; integer literal
   single: 0x; integer literal
   single: _ (underscore); in numeric literal

.. _integers:

Integer literals
----------------

Integer literals denote whole numbers. For example::

   7
   3
   2147483647

There is no limit for the length of integer literals apart from what can be
stored in available memory::

   7922816251426433759354395033679228162514264337593543950336

Underscores can be used to group digits for enhanced readability,
and are ignored for determining the numeric value of the literal.
For example, the following literals are equivalent::

   100_000_000_000
   100000000000
   1_00_00_00_00_000

Underscores can only occur between digits.
For example, ``_123``, ``321_``, and ``123__321`` are *not* valid literals.

Integers can be specified in binary (base 2), octal (base 8), or hexadecimal
(base 16) using the prefixes ``0b``, ``0o`` and ``0x``, respectively.
Hexadecimal digits 10 through 15 are represented by letters ``A``-``F``,
case-insensitive.  For example::

   0b100110111
   0b_1110_0101
   0o177
   0o377
   0xdeadbeef
   0xDead_Beef

An underscore can follow the base specifier.
For example, ``0x_1f`` is a valid literal, but ``0_x1f`` and ``0x__1f`` are
not.

Leading zeros in a non-zero decimal number are not allowed.
For example, ``0123`` is not a valid literal.
This is for disambiguation with C-style octal literals, which Python used
before version 3.0.

Formally, integer literals are described by the following lexical definitions:

.. grammar-snippet::
   :group: python-grammar

   integer:      `decinteger` | `bininteger` | `octinteger` | `hexinteger` | `zerointeger`
   decinteger:   `nonzerodigit` (["_"] `digit`)*
   bininteger:   "0" ("b" | "B") (["_"] `bindigit`)+
   octinteger:   "0" ("o" | "O") (["_"] `octdigit`)+
   hexinteger:   "0" ("x" | "X") (["_"] `hexdigit`)+
   zerointeger:  "0"+ (["_"] "0")*
   nonzerodigit: "1"..."9"
   digit:        "0"..."9"
   bindigit:     "0" | "1"
   octdigit:     "0"..."7"
   hexdigit:     `digit` | "a"..."f" | "A"..."F"

.. versionchanged:: 3.6
   Underscores are now allowed for grouping purposes in literals.


.. index::
   single: . (dot); in numeric literal
   single: e; in numeric literal
   single: _ (underscore); in numeric literal
.. _floating:

Floating-point literals
-----------------------

Floating-point (float) literals, such as ``3.14`` or ``1.5``, denote
:ref:`approximations of real numbers <datamodel-float>`.

They consist of *integer* and *fraction* parts, each composed of decimal digits.
The parts are separated by a decimal point, ``.``::

   2.71828
   4.0

Unlike in integer literals, leading zeros are allowed.
For example, ``077.010`` is legal, and denotes the same number as ``77.01``.

As in integer literals, single underscores may occur between digits to help
readability::

   96_485.332_123
   3.14_15_93

Either of these parts, but not both, can be empty. For example::

   10.  # (equivalent to 10.0)
   .001  # (equivalent to 0.001)

Optionally, the integer and fraction may be followed by an *exponent*:
the letter ``e`` or ``E``, followed by an optional sign, ``+`` or ``-``,
and a number in the same format as the integer and fraction parts.
The ``e`` or ``E`` represents "times ten raised to the power of"::

   1.0e3  # (represents 1.0×10³, or 1000.0)
   1.166e-5  # (represents 1.166×10⁻⁵, or 0.00001166)
   6.02214076e+23  # (represents 6.02214076×10²³, or 602214076000000000000000.)

In floats with only integer and exponent parts, the decimal point may be
omitted::

   1e3  # (equivalent to 1.e3 and 1.0e3)
   0e0  # (equivalent to 0.)

Formally, floating-point literals are described by the following
lexical definitions:

.. grammar-snippet::
   :group: python-grammar

   floatnumber:
      | `digitpart` "." [`digitpart`] [`exponent`]
      | "." `digitpart` [`exponent`]
      | `digitpart` `exponent`
   digitpart: `digit` (["_"] `digit`)*
   exponent:  ("e" | "E") ["+" | "-"] `digitpart`

.. versionchanged:: 3.6
   Underscores are now allowed for grouping purposes in literals.


.. index::
   single: j; in numeric literal
.. _imaginary:

Imaginary literals
------------------

Python has :ref:`complex number <typesnumeric>` objects, but no complex
literals.
Instead, *imaginary literals* denote complex numbers with a zero
real part.

For example, in math, the complex number 3+4.2\ *i* is written
as the real number 3 added to the imaginary number 4.2\ *i*.
Python uses a similar syntax, except the imaginary unit is written as ``j``
rather than *i*::

   3+4.2j

This is an expression composed
of the :ref:`integer literal <integers>` ``3``,
the :ref:`operator <operators>` '``+``',
and the :ref:`imaginary literal <imaginary>` ``4.2j``.
Since these are three separate tokens, whitespace is allowed between them::

   3 + 4.2j

No whitespace is allowed *within* each token.
In particular, the ``j`` suffix, may not be separated from the number
before it.

The number before the ``j`` has the same syntax as a floating-point literal.
Thus, the following are valid imaginary literals::

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

Unlike in a floating-point literal the decimal point can be omitted if the
imaginary number only has an integer part.
The number is still evaluated as a floating-point number, not an integer::

   10j
   0j
   1000000000000000000000000j   # equivalent to 1e+24j

The ``j`` suffix is case-insensitive.
That means you can use ``J`` instead::

   3.14J   # equivalent to 3.14j

Formally, imaginary literals are described by the following lexical definition:

.. grammar-snippet::
   :group: python-grammar

   imagnumber: (`floatnumber` | `digitpart`) ("j" | "J")


.. _delimiters:
.. _operators:
.. _lexical-ellipsis:

Operators and delimiters
========================

.. index::
   single: operators
   single: delimiters

The following grammar defines :dfn:`operator` and :dfn:`delimiter` tokens,
that is, the generic :data:`~token.OP` token type.
A :ref:`list of these tokens and their names <token_operators_delimiters>`
is also available in the :mod:`!token` module documentation.

.. grammar-snippet::
   :group: python-grammar

   OP:
      | assignment_operator
      | bitwise_operator
      | comparison_operator
      | enclosing_delimiter
      | other_delimiter
      | arithmetic_operator
      | "..."
      | other_op

   assignment_operator:   "+=" | "-=" | "*=" | "**=" | "/="  | "//=" | "%=" |
                          "&=" | "|=" | "^=" | "<<=" | ">>=" | "@="  | ":="
   bitwise_operator:      "&"  | "|"  | "^"  | "~"   | "<<"  | ">>"
   comparison_operator:   "<=" | ">=" | "<"  | ">"   | "=="  | "!="
   enclosing_delimiter:   "("  | ")"  | "["  | "]"   | "{"   | "}"
   other_delimiter:       ","  | ":"  | "!"  | ";"   | "="   | "->"
   arithmetic_operator:   "+"  | "-"  | "**" | "*"   | "//"  | "/"   | "%"
   other_op:              "."  | "@"

.. note::

   Generally, *operators* are used to combine :ref:`expressions <expressions>`,
   while *delimiters* serve other purposes.
   However, there is no clear, formal distinction between the two categories.

   Some tokens can serve as either operators or delimiters, depending on usage.
   For example, ``*`` is both the multiplication operator and a delimiter used
   for sequence unpacking, and ``@`` is both the matrix multiplication and
   a delimiter that introduces decorators.

   For some tokens, the distinction is unclear.
   For example, some people consider ``.``, ``(``, and ``)`` to be delimiters, while others
   see the :py:func:`getattr` operator and the function call operator(s).

   Some of Python's operators, like ``and``, ``or``, and ``not in``, use
   :ref:`keyword <keywords>` tokens rather than "symbols" (operator tokens).

A sequence of three consecutive periods (``...``) has a special
meaning as an :py:data:`Ellipsis` literal.

