
.. _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.
- ``lazy``, when used before an :keyword:`import` 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.

.. versionchanged:: 3.15
   ``lazy`` 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.

