|
- <!DOCTYPE html>
-
- <html lang="en" data-content_root="../">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta property="og:title" content="2. Lexical analysis" />
- <meta property="og:type" content="website" />
- <meta property="og:url" content="https://docs.python.org/3/reference/lexical_analysis.html" />
- <meta property="og:site_name" content="Python documentation" />
- <meta property="og:description" content="A Python program is read by a parser. Input to the parser is a stream of tokens, generated by the lexical analyzer. This chapter describes how the lexical analyzer breaks a file into tokens. Python..." />
- <meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
- <meta property="og:image:alt" content="Python documentation" />
- <meta name="description" content="A Python program is read by a parser. Input to the parser is a stream of tokens, generated by the lexical analyzer. This chapter describes how the lexical analyzer breaks a file into tokens. Python..." />
- <meta property="og:image:width" content="200" />
- <meta property="og:image:height" content="200" />
- <meta name="theme-color" content="#3776ab" />
-
- <title>2. Lexical analysis — Python 3.12.3 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
-
- <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=80d5e7a1" />
- <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=bb723527" />
- <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=b20cc3f5" />
-
- <script src="../_static/documentation_options.js?v=2c828074"></script>
- <script src="../_static/doctools.js?v=888ff710"></script>
- <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
-
- <script src="../_static/sidebar.js"></script>
-
- <link rel="search" type="application/opensearchdescription+xml"
- title="Search within Python 3.12.3 documentation"
- href="../_static/opensearch.xml"/>
- <link rel="author" title="About these documents" href="../about.html" />
- <link rel="index" title="Index" href="../genindex.html" />
- <link rel="search" title="Search" href="../search.html" />
- <link rel="copyright" title="Copyright" href="../copyright.html" />
- <link rel="next" title="3. Data model" href="datamodel.html" />
- <link rel="prev" title="1. Introduction" href="introduction.html" />
- <link rel="canonical" href="https://docs.python.org/3/reference/lexical_analysis.html" />
-
-
-
-
-
- <style>
- @media only screen {
- table.full-width-table {
- width: 100%;
- }
- }
- </style>
- <link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
- <link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
- <script type="text/javascript" src="../_static/copybutton.js"></script>
- <script type="text/javascript" src="../_static/menu.js"></script>
- <script type="text/javascript" src="../_static/search-focus.js"></script>
- <script type="text/javascript" src="../_static/themetoggle.js"></script>
-
- </head>
- <body>
- <div class="mobile-nav">
- <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
- aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
- <nav class="nav-content" role="navigation">
- <label for="menuToggler" class="toggler__label">
- <span></span>
- </label>
- <span class="nav-items-wrapper">
- <a href="https://www.python.org/" class="nav-logo">
- <img src="../_static/py.svg" alt="Python logo"/>
- </a>
- <span class="version_switcher_placeholder"></span>
- <form role="search" class="search" action="../search.html" method="get">
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
- <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
- </svg>
- <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
- <input type="submit" value="Go"/>
- </form>
- </span>
- </nav>
- <div class="menu-wrapper">
- <nav class="menu" role="navigation" aria-label="main navigation">
- <div class="language_switcher_placeholder"></div>
-
- <label class="theme-selector-label">
- Theme
- <select class="theme-selector" oninput="activateTheme(this.value)">
- <option value="auto" selected>Auto</option>
- <option value="light">Light</option>
- <option value="dark">Dark</option>
- </select>
- </label>
- <div>
- <h3><a href="../contents.html">Table of Contents</a></h3>
- <ul>
- <li><a class="reference internal" href="#">2. Lexical analysis</a><ul>
- <li><a class="reference internal" href="#line-structure">2.1. Line structure</a><ul>
- <li><a class="reference internal" href="#logical-lines">2.1.1. Logical lines</a></li>
- <li><a class="reference internal" href="#physical-lines">2.1.2. Physical lines</a></li>
- <li><a class="reference internal" href="#comments">2.1.3. Comments</a></li>
- <li><a class="reference internal" href="#encoding-declarations">2.1.4. Encoding declarations</a></li>
- <li><a class="reference internal" href="#explicit-line-joining">2.1.5. Explicit line joining</a></li>
- <li><a class="reference internal" href="#implicit-line-joining">2.1.6. Implicit line joining</a></li>
- <li><a class="reference internal" href="#blank-lines">2.1.7. Blank lines</a></li>
- <li><a class="reference internal" href="#indentation">2.1.8. Indentation</a></li>
- <li><a class="reference internal" href="#whitespace-between-tokens">2.1.9. Whitespace between tokens</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#other-tokens">2.2. Other tokens</a></li>
- <li><a class="reference internal" href="#identifiers">2.3. Identifiers and keywords</a><ul>
- <li><a class="reference internal" href="#keywords">2.3.1. Keywords</a></li>
- <li><a class="reference internal" href="#soft-keywords">2.3.2. Soft Keywords</a></li>
- <li><a class="reference internal" href="#reserved-classes-of-identifiers">2.3.3. Reserved classes of identifiers</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#literals">2.4. Literals</a><ul>
- <li><a class="reference internal" href="#string-and-bytes-literals">2.4.1. String and Bytes literals</a><ul>
- <li><a class="reference internal" href="#escape-sequences">2.4.1.1. Escape sequences</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#string-literal-concatenation">2.4.2. String literal concatenation</a></li>
- <li><a class="reference internal" href="#formatted-string-literals">2.4.3. f-strings</a></li>
- <li><a class="reference internal" href="#numeric-literals">2.4.4. Numeric literals</a></li>
- <li><a class="reference internal" href="#integer-literals">2.4.5. Integer literals</a></li>
- <li><a class="reference internal" href="#floating-point-literals">2.4.6. Floating point literals</a></li>
- <li><a class="reference internal" href="#imaginary-literals">2.4.7. Imaginary literals</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#operators">2.5. Operators</a></li>
- <li><a class="reference internal" href="#delimiters">2.6. Delimiters</a></li>
- </ul>
- </li>
- </ul>
-
- </div>
- <div>
- <h4>Previous topic</h4>
- <p class="topless"><a href="introduction.html"
- title="previous chapter"><span class="section-number">1. </span>Introduction</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="datamodel.html"
- title="next chapter"><span class="section-number">3. </span>Data model</a></p>
- </div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="../bugs.html">Report a Bug</a></li>
- <li>
- <a href="https://github.com/python/cpython/blob/main/Doc/reference/lexical_analysis.rst"
- rel="nofollow">Show Source
- </a>
- </li>
- </ul>
- </div>
- </nav>
- </div>
- </div>
-
-
- <div class="related" role="navigation" aria-label="related navigation">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="../genindex.html" title="General Index"
- accesskey="I">index</a></li>
- <li class="right" >
- <a href="../py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li class="right" >
- <a href="datamodel.html" title="3. Data model"
- accesskey="N">next</a> |</li>
- <li class="right" >
- <a href="introduction.html" title="1. Introduction"
- accesskey="P">previous</a> |</li>
-
- <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
- <li><a href="https://www.python.org/">Python</a> »</li>
- <li class="switchers">
- <div class="language_switcher_placeholder"></div>
- <div class="version_switcher_placeholder"></div>
- </li>
- <li>
-
- </li>
- <li id="cpython-language-and-version">
- <a href="../index.html">3.12.3 Documentation</a> »
- </li>
-
- <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">The Python Language Reference</a> »</li>
- <li class="nav-item nav-item-this"><a href=""><span class="section-number">2. </span>Lexical analysis</a></li>
- <li class="right">
-
-
- <div class="inline-search" role="search">
- <form class="inline-search" action="../search.html" method="get">
- <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
- <input type="submit" value="Go" />
- </form>
- </div>
- |
- </li>
- <li class="right">
- <label class="theme-selector-label">
- Theme
- <select class="theme-selector" oninput="activateTheme(this.value)">
- <option value="auto" selected>Auto</option>
- <option value="light">Light</option>
- <option value="dark">Dark</option>
- </select>
- </label> |</li>
-
- </ul>
- </div>
-
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body" role="main">
-
- <section id="lexical-analysis">
- <span id="lexical"></span><h1><span class="section-number">2. </span>Lexical analysis<a class="headerlink" href="#lexical-analysis" title="Link to this heading">¶</a></h1>
- <p id="index-0">A Python program is read by a <em>parser</em>. Input to the parser is a stream of
- <em>tokens</em>, generated by the <em>lexical analyzer</em>. This chapter describes how the
- lexical analyzer breaks a file into tokens.</p>
- <p>Python reads program text as Unicode code points; the encoding of a source file
- can be given by an encoding declaration and defaults to UTF-8, see <span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-3120/"><strong>PEP 3120</strong></a>
- for details. If the source file cannot be decoded, a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> is
- raised.</p>
- <section id="line-structure">
- <span id="id1"></span><h2><span class="section-number">2.1. </span>Line structure<a class="headerlink" href="#line-structure" title="Link to this heading">¶</a></h2>
- <p id="index-2">A Python program is divided into a number of <em>logical lines</em>.</p>
- <section id="logical-lines">
- <span id="id2"></span><h3><span class="section-number">2.1.1. </span>Logical lines<a class="headerlink" href="#logical-lines" title="Link to this heading">¶</a></h3>
- <p id="index-3">The end of a logical line is represented by the token NEWLINE. Statements
- cannot cross logical line boundaries except where NEWLINE is allowed by the
- syntax (e.g., between statements in compound statements). A logical line is
- constructed from one or more <em>physical lines</em> by following the explicit or
- implicit <em>line joining</em> rules.</p>
- </section>
- <section id="physical-lines">
- <span id="id3"></span><h3><span class="section-number">2.1.2. </span>Physical lines<a class="headerlink" href="#physical-lines" title="Link to this heading">¶</a></h3>
- <p>A physical line is a sequence of characters terminated by an end-of-line
- sequence. In source files and strings, any of the standard platform line
- termination sequences can be used - the Unix form using ASCII LF (linefeed),
- the Windows form using the ASCII sequence CR LF (return followed by linefeed),
- or the old Macintosh form using the ASCII CR (return) character. All of these
- forms can be used equally, regardless of platform. The end of input also serves
- as an implicit terminator for the final physical line.</p>
- <p>When embedding Python, source code strings should be passed to Python APIs using
- the standard C conventions for newline characters (the <code class="docutils literal notranslate"><span class="pre">\n</span></code> character,
- representing ASCII LF, is the line terminator).</p>
- </section>
- <section id="comments">
- <span id="id4"></span><h3><span class="section-number">2.1.3. </span>Comments<a class="headerlink" href="#comments" title="Link to this heading">¶</a></h3>
- <p id="index-4">A comment starts with a hash character (<code class="docutils literal notranslate"><span class="pre">#</span></code>) 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.</p>
- </section>
- <section id="encoding-declarations">
- <span id="encodings"></span><h3><span class="section-number">2.1.4. </span>Encoding declarations<a class="headerlink" href="#encoding-declarations" title="Link to this heading">¶</a></h3>
- <p id="index-5">If a comment in the first or second line of the Python script matches the
- regular expression <code class="docutils literal notranslate"><span class="pre">coding[=:]\s*([-\w.]+)</span></code>, 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</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- coding: <encoding-name> -*-</span>
- </pre></div>
- </div>
- <p>which is recognized also by GNU Emacs, and</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># vim:fileencoding=<encoding-name></span>
- </pre></div>
- </div>
- <p>which is recognized by Bram Moolenaar’s VIM.</p>
- <p>If no encoding declaration is found, the default encoding is UTF-8. If the
- implicit or explicit encoding of a file is UTF-8, an initial UTF-8 byte-order
- mark (b’xefxbbxbf’) is ignored rather than being a syntax error.</p>
- <p>If an encoding is declared, the encoding name must be recognized by Python
- (see <a class="reference internal" href="../library/codecs.html#standard-encodings"><span class="std std-ref">Standard Encodings</span></a>). The
- encoding is used for all lexical analysis, including string literals, comments
- and identifiers.</p>
- </section>
- <section id="explicit-line-joining">
- <span id="explicit-joining"></span><h3><span class="section-number">2.1.5. </span>Explicit line joining<a class="headerlink" href="#explicit-line-joining" title="Link to this heading">¶</a></h3>
- <p id="index-6">Two or more physical lines may be joined into logical lines using backslash
- characters (<code class="docutils literal notranslate"><span class="pre">\</span></code>), 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:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="mi">1900</span> <span class="o"><</span> <span class="n">year</span> <span class="o"><</span> <span class="mi">2100</span> <span class="ow">and</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">month</span> <span class="o"><=</span> <span class="mi">12</span> \
- <span class="ow">and</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">day</span> <span class="o"><=</span> <span class="mi">31</span> <span class="ow">and</span> <span class="mi">0</span> <span class="o"><=</span> <span class="n">hour</span> <span class="o"><</span> <span class="mi">24</span> \
- <span class="ow">and</span> <span class="mi">0</span> <span class="o"><=</span> <span class="n">minute</span> <span class="o"><</span> <span class="mi">60</span> <span class="ow">and</span> <span class="mi">0</span> <span class="o"><=</span> <span class="n">second</span> <span class="o"><</span> <span class="mi">60</span><span class="p">:</span> <span class="c1"># Looks like a valid date</span>
- <span class="k">return</span> <span class="mi">1</span>
- </pre></div>
- </div>
- <p>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.</p>
- </section>
- <section id="implicit-line-joining">
- <span id="implicit-joining"></span><h3><span class="section-number">2.1.6. </span>Implicit line joining<a class="headerlink" href="#implicit-line-joining" title="Link to this heading">¶</a></h3>
- <p>Expressions in parentheses, square brackets or curly braces can be split over
- more than one physical line without using backslashes. For example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">month_names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Januari'</span><span class="p">,</span> <span class="s1">'Februari'</span><span class="p">,</span> <span class="s1">'Maart'</span><span class="p">,</span> <span class="c1"># These are the</span>
- <span class="s1">'April'</span><span class="p">,</span> <span class="s1">'Mei'</span><span class="p">,</span> <span class="s1">'Juni'</span><span class="p">,</span> <span class="c1"># Dutch names</span>
- <span class="s1">'Juli'</span><span class="p">,</span> <span class="s1">'Augustus'</span><span class="p">,</span> <span class="s1">'September'</span><span class="p">,</span> <span class="c1"># for the months</span>
- <span class="s1">'Oktober'</span><span class="p">,</span> <span class="s1">'November'</span><span class="p">,</span> <span class="s1">'December'</span><span class="p">]</span> <span class="c1"># of the year</span>
- </pre></div>
- </div>
- <p>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.</p>
- </section>
- <section id="blank-lines">
- <span id="id5"></span><h3><span class="section-number">2.1.7. </span>Blank lines<a class="headerlink" href="#blank-lines" title="Link to this heading">¶</a></h3>
- <p id="index-7">A logical line that contains only spaces, tabs, formfeeds and possibly a
- comment, is ignored (i.e., no 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 (i.e. one containing not even
- whitespace or a comment) terminates a multi-line statement.</p>
- </section>
- <section id="indentation">
- <span id="id6"></span><h3><span class="section-number">2.1.8. </span>Indentation<a class="headerlink" href="#indentation" title="Link to this heading">¶</a></h3>
- <p id="index-8">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.</p>
- <p>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.</p>
- <p>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
- <a class="reference internal" href="../library/exceptions.html#TabError" title="TabError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TabError</span></code></a> is raised in that case.</p>
- <p><strong>Cross-platform compatibility note:</strong> 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.</p>
- <p>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).</p>
- <p id="index-9">The indentation levels of consecutive lines are used to generate INDENT and
- DEDENT tokens, using a stack, as follows.</p>
- <p>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 INDENT token is generated. If it is smaller, it <em>must</em> 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 DEDENT token is generated. At the
- end of the file, a DEDENT token is generated for each number remaining on the
- stack that is larger than zero.</p>
- <p>Here is an example of a correctly (though confusingly) indented piece of Python
- code:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">perm</span><span class="p">(</span><span class="n">l</span><span class="p">):</span>
- <span class="c1"># Compute the list of all permutations of l</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">:</span>
- <span class="k">return</span> <span class="p">[</span><span class="n">l</span><span class="p">]</span>
- <span class="n">r</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">)):</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">l</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
- <span class="n">p</span> <span class="o">=</span> <span class="n">perm</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">p</span><span class="p">:</span>
- <span class="n">r</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">r</span>
- </pre></div>
- </div>
- <p>The following example shows various indentation errors:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span> <span class="k">def</span> <span class="nf">perm</span><span class="p">(</span><span class="n">l</span><span class="p">):</span> <span class="c1"># error: first line indented</span>
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">)):</span> <span class="c1"># error: not indented</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">l</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
- <span class="n">p</span> <span class="o">=</span> <span class="n">perm</span><span class="p">(</span><span class="n">l</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:])</span> <span class="c1"># error: unexpected indent</span>
- <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">p</span><span class="p">:</span>
- <span class="n">r</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">r</span> <span class="c1"># error: inconsistent dedent</span>
- </pre></div>
- </div>
- <p>(Actually, the first three errors are detected by the parser; only the last
- error is found by the lexical analyzer — the indentation of <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">r</span></code> does
- not match a level popped off the stack.)</p>
- </section>
- <section id="whitespace-between-tokens">
- <span id="whitespace"></span><h3><span class="section-number">2.1.9. </span>Whitespace between tokens<a class="headerlink" href="#whitespace-between-tokens" title="Link to this heading">¶</a></h3>
- <p>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. Whitespace is needed between two tokens only if their concatenation
- could otherwise be interpreted as a different token (e.g., ab is one token, but
- a b is two tokens).</p>
- </section>
- </section>
- <section id="other-tokens">
- <span id="id7"></span><h2><span class="section-number">2.2. </span>Other tokens<a class="headerlink" href="#other-tokens" title="Link to this heading">¶</a></h2>
- <p>Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist:
- <em>identifiers</em>, <em>keywords</em>, <em>literals</em>, <em>operators</em>, and <em>delimiters</em>. Whitespace
- characters (other than 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.</p>
- </section>
- <section id="identifiers">
- <span id="identifiers-and-keywords"></span><h2><span class="section-number">2.3. </span>Identifiers and keywords<a class="headerlink" href="#identifiers" title="Link to this heading">¶</a></h2>
- <p id="index-10">Identifiers (also referred to as <em>names</em>) are described by the following lexical
- definitions.</p>
- <p>The syntax of identifiers in Python is based on the Unicode standard annex
- UAX-31, with elaboration and changes as defined below; see also <span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-3131/"><strong>PEP 3131</strong></a> for
- further details.</p>
- <p>Within the ASCII range (U+0001..U+007F), the valid characters for identifiers
- are the same as in Python 2.x: the uppercase and lowercase letters <code class="docutils literal notranslate"><span class="pre">A</span></code> through
- <code class="docutils literal notranslate"><span class="pre">Z</span></code>, the underscore <code class="docutils literal notranslate"><span class="pre">_</span></code> and, except for the first character, the digits
- <code class="docutils literal notranslate"><span class="pre">0</span></code> through <code class="docutils literal notranslate"><span class="pre">9</span></code>.</p>
- <p>Python 3.0 introduces additional characters from outside the ASCII range (see
- <span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-3131/"><strong>PEP 3131</strong></a>). For these characters, the classification uses the version of the
- Unicode Character Database as included in the <a class="reference internal" href="../library/unicodedata.html#module-unicodedata" title="unicodedata: Access the Unicode Database."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unicodedata</span></code></a> module.</p>
- <p>Identifiers are unlimited in length. Case is significant.</p>
- <pre>
- <strong id="grammar-token-python-grammar-identifier">identifier </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-xid_start"><code class="xref docutils literal notranslate"><span class="pre">xid_start</span></code></a> <a class="reference internal" href="#grammar-token-python-grammar-xid_continue"><code class="xref docutils literal notranslate"><span class="pre">xid_continue</span></code></a>*
- <strong id="grammar-token-python-grammar-id_start">id_start </strong> ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
- <strong id="grammar-token-python-grammar-id_continue">id_continue </strong> ::= <all characters in <a class="reference internal" href="#grammar-token-python-grammar-id_start"><code class="xref docutils literal notranslate"><span class="pre">id_start</span></code></a>, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
- <strong id="grammar-token-python-grammar-xid_start">xid_start </strong> ::= <all characters in <a class="reference internal" href="#grammar-token-python-grammar-id_start"><code class="xref docutils literal notranslate"><span class="pre">id_start</span></code></a> whose NFKC normalization is in "id_start xid_continue*">
- <strong id="grammar-token-python-grammar-xid_continue">xid_continue</strong> ::= <all characters in <a class="reference internal" href="#grammar-token-python-grammar-id_continue"><code class="xref docutils literal notranslate"><span class="pre">id_continue</span></code></a> whose NFKC normalization is in "id_continue*">
- </pre>
- <p>The Unicode category codes mentioned above stand for:</p>
- <ul class="simple">
- <li><p><em>Lu</em> - uppercase letters</p></li>
- <li><p><em>Ll</em> - lowercase letters</p></li>
- <li><p><em>Lt</em> - titlecase letters</p></li>
- <li><p><em>Lm</em> - modifier letters</p></li>
- <li><p><em>Lo</em> - other letters</p></li>
- <li><p><em>Nl</em> - letter numbers</p></li>
- <li><p><em>Mn</em> - nonspacing marks</p></li>
- <li><p><em>Mc</em> - spacing combining marks</p></li>
- <li><p><em>Nd</em> - decimal numbers</p></li>
- <li><p><em>Pc</em> - connector punctuations</p></li>
- <li><p><em>Other_ID_Start</em> - explicit list of characters in <a class="reference external" href="https://www.unicode.org/Public/15.0.0/ucd/PropList.txt">PropList.txt</a> to support backwards
- compatibility</p></li>
- <li><p><em>Other_ID_Continue</em> - likewise</p></li>
- </ul>
- <p>All identifiers are converted into the normal form NFKC while parsing; comparison
- of identifiers is based on NFKC.</p>
- <p>A non-normative HTML file listing all valid identifier characters for Unicode
- 15.0.0 can be found at
- <a class="reference external" href="https://www.unicode.org/Public/15.0.0/ucd/DerivedCoreProperties.txt">https://www.unicode.org/Public/15.0.0/ucd/DerivedCoreProperties.txt</a></p>
- <section id="keywords">
- <span id="id8"></span><h3><span class="section-number">2.3.1. </span>Keywords<a class="headerlink" href="#keywords" title="Link to this heading">¶</a></h3>
- <p id="index-13">The following identifiers are used as reserved words, or <em>keywords</em> of the
- language, and cannot be used as ordinary identifiers. They must be spelled
- exactly as written here:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>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
- </pre></div>
- </div>
- </section>
- <section id="soft-keywords">
- <span id="id9"></span><h3><span class="section-number">2.3.2. </span>Soft Keywords<a class="headerlink" href="#soft-keywords" title="Link to this heading">¶</a></h3>
- <div class="versionadded" id="index-14">
- <p><span class="versionmodified added">New in version 3.10.</span></p>
- </div>
- <p>Some identifiers are only reserved under specific contexts. These are known as
- <em>soft keywords</em>. The identifiers <code class="docutils literal notranslate"><span class="pre">match</span></code>, <code class="docutils literal notranslate"><span class="pre">case</span></code>, <code class="docutils literal notranslate"><span class="pre">type</span></code> and <code class="docutils literal notranslate"><span class="pre">_</span></code> can
- syntactically act as keywords in certain contexts,
- but this distinction is done at the parser level, not when tokenizing.</p>
- <p>As soft keywords, their use in the grammar is possible while still
- preserving compatibility with existing code that uses these names as
- identifier names.</p>
- <p><code class="docutils literal notranslate"><span class="pre">match</span></code>, <code class="docutils literal notranslate"><span class="pre">case</span></code>, and <code class="docutils literal notranslate"><span class="pre">_</span></code> are used in the <a class="reference internal" href="compound_stmts.html#match"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">match</span></code></a> statement.
- <code class="docutils literal notranslate"><span class="pre">type</span></code> is used in the <a class="reference internal" href="simple_stmts.html#type"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">type</span></code></a> statement.</p>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span><code class="docutils literal notranslate"><span class="pre">type</span></code> is now a soft keyword.</p>
- </div>
- </section>
- <section id="reserved-classes-of-identifiers">
- <span id="id-classes"></span><span id="index-15"></span><h3><span class="section-number">2.3.3. </span>Reserved classes of identifiers<a class="headerlink" href="#reserved-classes-of-identifiers" title="Link to this heading">¶</a></h3>
- <p>Certain classes of identifiers (besides keywords) have special meanings. These
- classes are identified by the patterns of leading and trailing underscore
- characters:</p>
- <dl>
- <dt><code class="docutils literal notranslate"><span class="pre">_*</span></code></dt><dd><p>Not imported by <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">module</span> <span class="pre">import</span> <span class="pre">*</span></code>.</p>
- </dd>
- <dt><code class="docutils literal notranslate"><span class="pre">_</span></code></dt><dd><p>In a <code class="docutils literal notranslate"><span class="pre">case</span></code> pattern within a <a class="reference internal" href="compound_stmts.html#match"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">match</span></code></a> statement, <code class="docutils literal notranslate"><span class="pre">_</span></code> is a
- <a class="reference internal" href="#soft-keywords"><span class="std std-ref">soft keyword</span></a> that denotes a
- <a class="reference internal" href="compound_stmts.html#wildcard-patterns"><span class="std std-ref">wildcard</span></a>.</p>
- <p>Separately, the interactive interpreter makes the result of the last evaluation
- available in the variable <code class="docutils literal notranslate"><span class="pre">_</span></code>.
- (It is stored in the <a class="reference internal" href="../library/builtins.html#module-builtins" title="builtins: The module that provides the built-in namespace."><code class="xref py py-mod docutils literal notranslate"><span class="pre">builtins</span></code></a> module, alongside built-in
- functions like <code class="docutils literal notranslate"><span class="pre">print</span></code>.)</p>
- <p>Elsewhere, <code class="docutils literal notranslate"><span class="pre">_</span></code> is a regular identifier. It is often used to name
- “special” items, but it is not special to Python itself.</p>
- <div class="admonition note">
- <p class="admonition-title">Note</p>
- <p>The name <code class="docutils literal notranslate"><span class="pre">_</span></code> is often used in conjunction with internationalization;
- refer to the documentation for the <a class="reference internal" href="../library/gettext.html#module-gettext" title="gettext: Multilingual internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">gettext</span></code></a> module for more
- information on this convention.</p>
- <p>It is also commonly used for unused variables.</p>
- </div>
- </dd>
- <dt><code class="docutils literal notranslate"><span class="pre">__*__</span></code></dt><dd><p>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 <a class="reference internal" href="datamodel.html#specialnames"><span class="std std-ref">Special method names</span></a> section and elsewhere.
- More will likely be defined in future versions of Python. <em>Any</em> use of <code class="docutils literal notranslate"><span class="pre">__*__</span></code> names,
- in any context, that does not follow explicitly documented use, is subject to
- breakage without warning.</p>
- </dd>
- <dt><code class="docutils literal notranslate"><span class="pre">__*</span></code></dt><dd><p>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
- <a class="reference internal" href="expressions.html#atom-identifiers"><span class="std std-ref">Identifiers (Names)</span></a>.</p>
- </dd>
- </dl>
- </section>
- </section>
- <section id="literals">
- <span id="id10"></span><h2><span class="section-number">2.4. </span>Literals<a class="headerlink" href="#literals" title="Link to this heading">¶</a></h2>
- <p id="index-16">Literals are notations for constant values of some built-in types.</p>
- <section id="string-and-bytes-literals">
- <span id="strings"></span><span id="index-17"></span><h3><span class="section-number">2.4.1. </span>String and Bytes literals<a class="headerlink" href="#string-and-bytes-literals" title="Link to this heading">¶</a></h3>
- <p>String literals are described by the following lexical definitions:</p>
- <pre>
- <strong id="grammar-token-python-grammar-stringliteral">stringliteral </strong> ::= [<a class="reference internal" href="#grammar-token-python-grammar-stringprefix"><code class="xref docutils literal notranslate"><span class="pre">stringprefix</span></code></a>](<a class="reference internal" href="#grammar-token-python-grammar-shortstring"><code class="xref docutils literal notranslate"><span class="pre">shortstring</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-longstring"><code class="xref docutils literal notranslate"><span class="pre">longstring</span></code></a>)
- <strong id="grammar-token-python-grammar-stringprefix">stringprefix </strong> ::= "r" | "u" | "R" | "U" | "f" | "F"
- | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
- <strong id="grammar-token-python-grammar-shortstring">shortstring </strong> ::= "'" <a class="reference internal" href="#grammar-token-python-grammar-shortstringitem"><code class="xref docutils literal notranslate"><span class="pre">shortstringitem</span></code></a>* "'" | '"' <a class="reference internal" href="#grammar-token-python-grammar-shortstringitem"><code class="xref docutils literal notranslate"><span class="pre">shortstringitem</span></code></a>* '"'
- <strong id="grammar-token-python-grammar-longstring">longstring </strong> ::= "'''" <a class="reference internal" href="#grammar-token-python-grammar-longstringitem"><code class="xref docutils literal notranslate"><span class="pre">longstringitem</span></code></a>* "'''" | '"""' <a class="reference internal" href="#grammar-token-python-grammar-longstringitem"><code class="xref docutils literal notranslate"><span class="pre">longstringitem</span></code></a>* '"""'
- <strong id="grammar-token-python-grammar-shortstringitem">shortstringitem</strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-shortstringchar"><code class="xref docutils literal notranslate"><span class="pre">shortstringchar</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-stringescapeseq"><code class="xref docutils literal notranslate"><span class="pre">stringescapeseq</span></code></a>
- <strong id="grammar-token-python-grammar-longstringitem">longstringitem </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-longstringchar"><code class="xref docutils literal notranslate"><span class="pre">longstringchar</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-stringescapeseq"><code class="xref docutils literal notranslate"><span class="pre">stringescapeseq</span></code></a>
- <strong id="grammar-token-python-grammar-shortstringchar">shortstringchar</strong> ::= <any source character except "\" or newline or the quote>
- <strong id="grammar-token-python-grammar-longstringchar">longstringchar </strong> ::= <any source character except "\">
- <strong id="grammar-token-python-grammar-stringescapeseq">stringescapeseq</strong> ::= "\" <any source character>
- </pre>
- <pre>
- <strong id="grammar-token-python-grammar-bytesliteral">bytesliteral </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-bytesprefix"><code class="xref docutils literal notranslate"><span class="pre">bytesprefix</span></code></a>(<a class="reference internal" href="#grammar-token-python-grammar-shortbytes"><code class="xref docutils literal notranslate"><span class="pre">shortbytes</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-longbytes"><code class="xref docutils literal notranslate"><span class="pre">longbytes</span></code></a>)
- <strong id="grammar-token-python-grammar-bytesprefix">bytesprefix </strong> ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
- <strong id="grammar-token-python-grammar-shortbytes">shortbytes </strong> ::= "'" <a class="reference internal" href="#grammar-token-python-grammar-shortbytesitem"><code class="xref docutils literal notranslate"><span class="pre">shortbytesitem</span></code></a>* "'" | '"' <a class="reference internal" href="#grammar-token-python-grammar-shortbytesitem"><code class="xref docutils literal notranslate"><span class="pre">shortbytesitem</span></code></a>* '"'
- <strong id="grammar-token-python-grammar-longbytes">longbytes </strong> ::= "'''" <a class="reference internal" href="#grammar-token-python-grammar-longbytesitem"><code class="xref docutils literal notranslate"><span class="pre">longbytesitem</span></code></a>* "'''" | '"""' <a class="reference internal" href="#grammar-token-python-grammar-longbytesitem"><code class="xref docutils literal notranslate"><span class="pre">longbytesitem</span></code></a>* '"""'
- <strong id="grammar-token-python-grammar-shortbytesitem">shortbytesitem</strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-shortbyteschar"><code class="xref docutils literal notranslate"><span class="pre">shortbyteschar</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-bytesescapeseq"><code class="xref docutils literal notranslate"><span class="pre">bytesescapeseq</span></code></a>
- <strong id="grammar-token-python-grammar-longbytesitem">longbytesitem </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-longbyteschar"><code class="xref docutils literal notranslate"><span class="pre">longbyteschar</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-bytesescapeseq"><code class="xref docutils literal notranslate"><span class="pre">bytesescapeseq</span></code></a>
- <strong id="grammar-token-python-grammar-shortbyteschar">shortbyteschar</strong> ::= <any ASCII character except "\" or newline or the quote>
- <strong id="grammar-token-python-grammar-longbyteschar">longbyteschar </strong> ::= <any ASCII character except "\">
- <strong id="grammar-token-python-grammar-bytesescapeseq">bytesescapeseq</strong> ::= "\" <any ASCII character>
- </pre>
- <p>One syntactic restriction not indicated by these productions is that whitespace
- is not allowed between the <a class="reference internal" href="#grammar-token-python-grammar-stringprefix"><code class="xref std std-token docutils literal notranslate"><span class="pre">stringprefix</span></code></a> or
- <a class="reference internal" href="#grammar-token-python-grammar-bytesprefix"><code class="xref std std-token docutils literal notranslate"><span class="pre">bytesprefix</span></code></a> and the rest of the literal. The source
- character set is defined by the encoding declaration; it is UTF-8 if no encoding
- declaration is given in the source file; see section <a class="reference internal" href="#encodings"><span class="std std-ref">Encoding declarations</span></a>.</p>
- <p id="index-18">In plain English: Both types of literals can be enclosed in matching single quotes
- (<code class="docutils literal notranslate"><span class="pre">'</span></code>) or double quotes (<code class="docutils literal notranslate"><span class="pre">"</span></code>). They can also be enclosed in matching groups
- of three single or double quotes (these are generally referred to as
- <em>triple-quoted strings</em>). The backslash (<code class="docutils literal notranslate"><span class="pre">\</span></code>) character is used to give special
- meaning to otherwise ordinary characters like <code class="docutils literal notranslate"><span class="pre">n</span></code>, which means ‘newline’ when
- escaped (<code class="docutils literal notranslate"><span class="pre">\n</span></code>). It can also be used to escape characters that otherwise have a
- special meaning, such as newline, backslash itself, or the quote character.
- See <a class="reference internal" href="#escape-sequences"><span class="std std-ref">escape sequences</span></a> below for examples.</p>
- <p id="index-19">Bytes literals are always prefixed with <code class="docutils literal notranslate"><span class="pre">'b'</span></code> or <code class="docutils literal notranslate"><span class="pre">'B'</span></code>; they produce an
- instance of the <a class="reference internal" href="../library/stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> type instead of the <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> type. They
- may only contain ASCII characters; bytes with a numeric value of 128 or greater
- must be expressed with escapes.</p>
- <p id="index-20">Both string and bytes literals may optionally be prefixed with a letter <code class="docutils literal notranslate"><span class="pre">'r'</span></code>
- or <code class="docutils literal notranslate"><span class="pre">'R'</span></code>; such strings are called <em class="dfn">raw strings</em> and treat backslashes as
- literal characters. As a result, in string literals, <code class="docutils literal notranslate"><span class="pre">'\U'</span></code> and <code class="docutils literal notranslate"><span class="pre">'\u'</span></code>
- escapes in raw strings are not treated specially. Given that Python 2.x’s raw
- unicode literals behave differently than Python 3.x’s the <code class="docutils literal notranslate"><span class="pre">'ur'</span></code> syntax
- is not supported.</p>
- <div class="versionadded">
- <p><span class="versionmodified added">New in version 3.3: </span>The <code class="docutils literal notranslate"><span class="pre">'rb'</span></code> prefix of raw bytes literals has been added as a synonym
- of <code class="docutils literal notranslate"><span class="pre">'br'</span></code>.</p>
- <p>Support for the unicode legacy literal (<code class="docutils literal notranslate"><span class="pre">u'value'</span></code>) was reintroduced
- to simplify the maintenance of dual Python 2.x and 3.x codebases.
- See <span class="target" id="index-21"></span><a class="pep reference external" href="https://peps.python.org/pep-0414/"><strong>PEP 414</strong></a> for more information.</p>
- </div>
- <p id="index-22">A string literal with <code class="docutils literal notranslate"><span class="pre">'f'</span></code> or <code class="docutils literal notranslate"><span class="pre">'F'</span></code> in its prefix is a
- <em class="dfn">formatted string literal</em>; see <a class="reference internal" href="#f-strings"><span class="std std-ref">f-strings</span></a>. The <code class="docutils literal notranslate"><span class="pre">'f'</span></code> may be
- combined with <code class="docutils literal notranslate"><span class="pre">'r'</span></code>, but not with <code class="docutils literal notranslate"><span class="pre">'b'</span></code> or <code class="docutils literal notranslate"><span class="pre">'u'</span></code>, therefore raw
- formatted strings are possible, but formatted bytes literals are not.</p>
- <p>In triple-quoted literals, unescaped newlines and quotes are allowed (and are
- retained), except that three unescaped quotes in a row terminate the literal. (A
- “quote” is the character used to open the literal, i.e. either <code class="docutils literal notranslate"><span class="pre">'</span></code> or <code class="docutils literal notranslate"><span class="pre">"</span></code>.)</p>
- <section id="escape-sequences">
- <span id="index-23"></span><span id="id11"></span><h4><span class="section-number">2.4.1.1. </span>Escape sequences<a class="headerlink" href="#escape-sequences" title="Link to this heading">¶</a></h4>
- <p>Unless an <code class="docutils literal notranslate"><span class="pre">'r'</span></code> or <code class="docutils literal notranslate"><span class="pre">'R'</span></code> 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:</p>
- <table class="docutils align-default">
- <thead>
- <tr class="row-odd"><th class="head"><p>Escape Sequence</p></th>
- <th class="head"><p>Meaning</p></th>
- <th class="head"><p>Notes</p></th>
- </tr>
- </thead>
- <tbody>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\</span></code><newline></p></td>
- <td><p>Backslash and newline ignored</p></td>
- <td><p>(1)</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">\\</span></code></p></td>
- <td><p>Backslash (<code class="docutils literal notranslate"><span class="pre">\</span></code>)</p></td>
- <td></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\'</span></code></p></td>
- <td><p>Single quote (<code class="docutils literal notranslate"><span class="pre">'</span></code>)</p></td>
- <td></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">\"</span></code></p></td>
- <td><p>Double quote (<code class="docutils literal notranslate"><span class="pre">"</span></code>)</p></td>
- <td></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\a</span></code></p></td>
- <td><p>ASCII Bell (BEL)</p></td>
- <td></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">\b</span></code></p></td>
- <td><p>ASCII Backspace (BS)</p></td>
- <td></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\f</span></code></p></td>
- <td><p>ASCII Formfeed (FF)</p></td>
- <td></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">\n</span></code></p></td>
- <td><p>ASCII Linefeed (LF)</p></td>
- <td></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\r</span></code></p></td>
- <td><p>ASCII Carriage Return (CR)</p></td>
- <td></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">\t</span></code></p></td>
- <td><p>ASCII Horizontal Tab (TAB)</p></td>
- <td></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">\v</span></code></p></td>
- <td><p>ASCII Vertical Tab (VT)</p></td>
- <td></td>
- </tr>
- <tr class="row-odd"><td><p><code class="samp docutils literal notranslate"><span class="pre">\</span><em><span class="pre">ooo</span></em></code></p></td>
- <td><p>Character with octal value
- <em>ooo</em></p></td>
- <td><p>(2,4)</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="samp docutils literal notranslate"><span class="pre">\x</span><em><span class="pre">hh</span></em></code></p></td>
- <td><p>Character with hex value <em>hh</em></p></td>
- <td><p>(3,4)</p></td>
- </tr>
- </tbody>
- </table>
- <p>Escape sequences only recognized in string literals are:</p>
- <table class="docutils align-default">
- <thead>
- <tr class="row-odd"><th class="head"><p>Escape Sequence</p></th>
- <th class="head"><p>Meaning</p></th>
- <th class="head"><p>Notes</p></th>
- </tr>
- </thead>
- <tbody>
- <tr class="row-even"><td><p><code class="samp docutils literal notranslate"><span class="pre">\N{</span><em><span class="pre">name</span></em><span class="pre">}</span></code></p></td>
- <td><p>Character named <em>name</em> in the
- Unicode database</p></td>
- <td><p>(5)</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="samp docutils literal notranslate"><span class="pre">\u</span><em><span class="pre">xxxx</span></em></code></p></td>
- <td><p>Character with 16-bit hex value
- <em>xxxx</em></p></td>
- <td><p>(6)</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="samp docutils literal notranslate"><span class="pre">\U</span><em><span class="pre">xxxxxxxx</span></em></code></p></td>
- <td><p>Character with 32-bit hex value
- <em>xxxxxxxx</em></p></td>
- <td><p>(7)</p></td>
- </tr>
- </tbody>
- </table>
- <p>Notes:</p>
- <ol class="arabic">
- <li><p>A backslash can be added at the end of a line to ignore the newline:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s1">'This string will not include </span><span class="se">\</span>
- <span class="gp">... </span><span class="s1">backslashes or newline characters.'</span>
- <span class="go">'This string will not include backslashes or newline characters.'</span>
- </pre></div>
- </div>
- <p>The same result can be achieved using <a class="reference internal" href="#strings"><span class="std std-ref">triple-quoted strings</span></a>,
- or parentheses and <a class="reference internal" href="#string-concatenation"><span class="std std-ref">string literal concatenation</span></a>.</p>
- </li>
- <li><p>As in Standard C, up to three octal digits are accepted.</p>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.11: </span>Octal escapes with value larger than <code class="docutils literal notranslate"><span class="pre">0o377</span></code> produce a
- <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>.</p>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span>Octal escapes with value larger than <code class="docutils literal notranslate"><span class="pre">0o377</span></code> produce a
- <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>. In a future Python version they will be eventually
- a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>.</p>
- </div>
- </li>
- <li><p>Unlike in Standard C, exactly two hex digits are required.</p></li>
- <li><p>In a bytes literal, hexadecimal and octal escapes denote the byte with the
- given value. In a string literal, these escapes denote a Unicode character
- with the given value.</p></li>
- <li><div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.3: </span>Support for name aliases <a class="footnote-reference brackets" href="#id16" id="id12" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a> has been added.</p>
- </div>
- </li>
- <li><p>Exactly four hex digits are required.</p></li>
- <li><p>Any Unicode character can be encoded this way. Exactly eight hex digits
- are required.</p></li>
- </ol>
- <p id="index-24">Unlike Standard C, all unrecognized escape sequences are left in the string
- unchanged, i.e., <em>the backslash is left in the result</em>. (This behavior is
- useful when debugging: if an escape sequence is mistyped, the resulting output
- is more easily recognized as broken.) It is also important to note that the
- escape sequences only recognized in string literals fall into the category of
- unrecognized escapes for bytes literals.</p>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.6: </span>Unrecognized escape sequences produce a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>.</p>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span>Unrecognized escape sequences produce a <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>. In a future
- Python version they will be eventually a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>.</p>
- </div>
- <p>Even in a raw literal, quotes can be escaped with a backslash, but the
- backslash remains in the result; for example, <code class="docutils literal notranslate"><span class="pre">r"\""</span></code> is a valid string
- literal consisting of two characters: a backslash and a double quote; <code class="docutils literal notranslate"><span class="pre">r"\"</span></code>
- is not a valid string literal (even a raw string cannot end in an odd number of
- backslashes). Specifically, <em>a raw literal cannot end in a single backslash</em>
- (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, <em>not</em> as a line continuation.</p>
- </section>
- </section>
- <section id="string-literal-concatenation">
- <span id="string-concatenation"></span><h3><span class="section-number">2.4.2. </span>String literal concatenation<a class="headerlink" href="#string-literal-concatenation" title="Link to this heading">¶</a></h3>
- <p>Multiple adjacent string or bytes literals (delimited by whitespace), possibly
- using different quoting conventions, are allowed, and their meaning is the same
- as their concatenation. Thus, <code class="docutils literal notranslate"><span class="pre">"hello"</span> <span class="pre">'world'</span></code> is equivalent to
- <code class="docutils literal notranslate"><span class="pre">"helloworld"</span></code>. This feature can be used to reduce the number of backslashes
- needed, to split long strings conveniently across long lines, or even to add
- comments to parts of strings, for example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s2">"[A-Za-z_]"</span> <span class="c1"># letter or underscore</span>
- <span class="s2">"[A-Za-z0-9_]*"</span> <span class="c1"># letter, digit or underscore</span>
- <span class="p">)</span>
- </pre></div>
- </div>
- <p>Note that this feature is defined at the syntactical level, but implemented at
- compile time. The ‘+’ operator must be used to concatenate string expressions
- at run time. Also note that literal concatenation can use different quoting
- styles for each component (even mixing raw strings and triple quoted strings),
- and formatted string literals may be concatenated with plain string literals.</p>
- </section>
- <section id="formatted-string-literals">
- <span id="f-strings"></span><span id="index-25"></span><span id="id13"></span><h3><span class="section-number">2.4.3. </span>f-strings<a class="headerlink" href="#formatted-string-literals" title="Link to this heading">¶</a></h3>
- <div class="versionadded">
- <p><span class="versionmodified added">New in version 3.6.</span></p>
- </div>
- <p>A <em class="dfn">formatted string literal</em> or <em class="dfn">f-string</em> is a string literal
- that is prefixed with <code class="docutils literal notranslate"><span class="pre">'f'</span></code> or <code class="docutils literal notranslate"><span class="pre">'F'</span></code>. These strings may contain
- replacement fields, which are expressions delimited by curly braces <code class="docutils literal notranslate"><span class="pre">{}</span></code>.
- While other string literals always have a constant value, formatted strings
- are really expressions evaluated at run time.</p>
- <p>Escape sequences are decoded like in ordinary string literals (except when
- a literal is also marked as a raw string). After decoding, the grammar
- for the contents of the string is:</p>
- <pre>
- <strong id="grammar-token-python-grammar-f_string">f_string </strong> ::= (<a class="reference internal" href="#grammar-token-python-grammar-literal_char"><code class="xref docutils literal notranslate"><span class="pre">literal_char</span></code></a> | "{{" | "}}" | <a class="reference internal" href="#grammar-token-python-grammar-replacement_field"><code class="xref docutils literal notranslate"><span class="pre">replacement_field</span></code></a>)*
- <strong id="grammar-token-python-grammar-replacement_field">replacement_field</strong> ::= "{" <a class="reference internal" href="#grammar-token-python-grammar-f_expression"><code class="xref docutils literal notranslate"><span class="pre">f_expression</span></code></a> ["="] ["!" <a class="reference internal" href="#grammar-token-python-grammar-conversion"><code class="xref docutils literal notranslate"><span class="pre">conversion</span></code></a>] [":" <a class="reference internal" href="#grammar-token-python-grammar-format_spec"><code class="xref docutils literal notranslate"><span class="pre">format_spec</span></code></a>] "}"
- <strong id="grammar-token-python-grammar-f_expression">f_expression </strong> ::= (<a class="reference internal" href="expressions.html#grammar-token-python-grammar-conditional_expression"><code class="xref docutils literal notranslate"><span class="pre">conditional_expression</span></code></a> | "*" <a class="reference internal" href="expressions.html#grammar-token-python-grammar-or_expr"><code class="xref docutils literal notranslate"><span class="pre">or_expr</span></code></a>)
- ("," <a class="reference internal" href="expressions.html#grammar-token-python-grammar-conditional_expression"><code class="xref docutils literal notranslate"><span class="pre">conditional_expression</span></code></a> | "," "*" <a class="reference internal" href="expressions.html#grammar-token-python-grammar-or_expr"><code class="xref docutils literal notranslate"><span class="pre">or_expr</span></code></a>)* [","]
- | <a class="reference internal" href="expressions.html#grammar-token-python-grammar-yield_expression"><code class="xref docutils literal notranslate"><span class="pre">yield_expression</span></code></a>
- <strong id="grammar-token-python-grammar-conversion">conversion </strong> ::= "s" | "r" | "a"
- <strong id="grammar-token-python-grammar-format_spec">format_spec </strong> ::= (<a class="reference internal" href="#grammar-token-python-grammar-literal_char"><code class="xref docutils literal notranslate"><span class="pre">literal_char</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-replacement_field"><code class="xref docutils literal notranslate"><span class="pre">replacement_field</span></code></a>)*
- <strong id="grammar-token-python-grammar-literal_char">literal_char </strong> ::= <any code point except "{", "}" or NULL>
- </pre>
- <p>The parts of the string outside curly braces are treated literally,
- except that any doubled curly braces <code class="docutils literal notranslate"><span class="pre">'{{'</span></code> or <code class="docutils literal notranslate"><span class="pre">'}}'</span></code> are replaced
- with the corresponding single curly brace. A single opening curly
- bracket <code class="docutils literal notranslate"><span class="pre">'{'</span></code> marks a replacement field, which starts with a
- Python expression. To display both the expression text and its value after
- evaluation, (useful in debugging), an equal sign <code class="docutils literal notranslate"><span class="pre">'='</span></code> may be added after the
- expression. A conversion field, introduced by an exclamation point <code class="docutils literal notranslate"><span class="pre">'!'</span></code> may
- follow. A format specifier may also be appended, introduced by a colon <code class="docutils literal notranslate"><span class="pre">':'</span></code>.
- A replacement field ends with a closing curly bracket <code class="docutils literal notranslate"><span class="pre">'}'</span></code>.</p>
- <p>Expressions in formatted string literals are treated like regular
- Python expressions surrounded by parentheses, with a few exceptions.
- An empty expression is not allowed, and both <a class="reference internal" href="expressions.html#lambda"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code></a> and
- assignment expressions <code class="docutils literal notranslate"><span class="pre">:=</span></code> must be surrounded by explicit parentheses.
- Each expression is evaluated in the context where the formatted string literal
- appears, in order from left to right. Replacement expressions can contain
- newlines in both single-quoted and triple-quoted f-strings and they can contain
- comments. Everything that comes after a <code class="docutils literal notranslate"><span class="pre">#</span></code> inside a replacement field
- is a comment (even closing braces and quotes). In that case, replacement fields
- must be closed in a different line.</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>>>> f"abc{a # This is a comment }"
- ... + 3}"
- 'abc5'
- </pre></div>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.7: </span>Prior to Python 3.7, an <a class="reference internal" href="expressions.html#await"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">await</span></code></a> expression and comprehensions
- containing an <a class="reference internal" href="compound_stmts.html#async-for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">async</span> <span class="pre">for</span></code></a> clause were illegal in the expressions
- in formatted string literals due to a problem with the implementation.</p>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span>Prior to Python 3.12, comments were not allowed inside f-string replacement
- fields.</p>
- </div>
- <p>When the equal sign <code class="docutils literal notranslate"><span class="pre">'='</span></code> is provided, the output will have the expression
- text, the <code class="docutils literal notranslate"><span class="pre">'='</span></code> and the evaluated value. Spaces after the opening brace
- <code class="docutils literal notranslate"><span class="pre">'{'</span></code>, within the expression and after the <code class="docutils literal notranslate"><span class="pre">'='</span></code> are all retained in the
- output. By default, the <code class="docutils literal notranslate"><span class="pre">'='</span></code> causes the <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a> of the expression to be
- provided, unless there is a format specified. When a format is specified it
- defaults to the <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a> of the expression unless a conversion <code class="docutils literal notranslate"><span class="pre">'!r'</span></code> is
- declared.</p>
- <div class="versionadded">
- <p><span class="versionmodified added">New in version 3.8: </span>The equal sign <code class="docutils literal notranslate"><span class="pre">'='</span></code>.</p>
- </div>
- <p>If a conversion is specified, the result of evaluating the expression
- is converted before formatting. Conversion <code class="docutils literal notranslate"><span class="pre">'!s'</span></code> calls <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a> on
- the result, <code class="docutils literal notranslate"><span class="pre">'!r'</span></code> calls <a class="reference internal" href="../library/functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a>, and <code class="docutils literal notranslate"><span class="pre">'!a'</span></code> calls <a class="reference internal" href="../library/functions.html#ascii" title="ascii"><code class="xref py py-func docutils literal notranslate"><span class="pre">ascii()</span></code></a>.</p>
- <p>The result is then formatted using the <a class="reference internal" href="../library/functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> protocol. The
- format specifier is passed to the <a class="reference internal" href="datamodel.html#object.__format__" title="object.__format__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__format__()</span></code></a> method of the
- expression or conversion result. An empty string is passed when the
- format specifier is omitted. The formatted result is then included in
- the final value of the whole string.</p>
- <p>Top-level format specifiers may include nested replacement fields. These nested
- fields may include their own conversion fields and <a class="reference internal" href="../library/string.html#formatspec"><span class="std std-ref">format specifiers</span></a>, but may not include more deeply nested replacement fields. The
- <a class="reference internal" href="../library/string.html#formatspec"><span class="std std-ref">format specifier mini-language</span></a> is the same as that used by
- the <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> method.</p>
- <p>Formatted string literals may be concatenated, but replacement fields
- cannot be split across literals.</p>
- <p>Some examples of formatted string literals:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">name</span> <span class="o">=</span> <span class="s2">"Fred"</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"He said his name is </span><span class="si">{</span><span class="n">name</span><span class="si">!r}</span><span class="s2">."</span>
- <span class="go">"He said his name is 'Fred'."</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"He said his name is </span><span class="si">{</span><span class="nb">repr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span> <span class="c1"># repr() is equivalent to !r</span>
- <span class="go">"He said his name is 'Fred'."</span>
- <span class="gp">>>> </span><span class="n">width</span> <span class="o">=</span> <span class="mi">10</span>
- <span class="gp">>>> </span><span class="n">precision</span> <span class="o">=</span> <span class="mi">4</span>
- <span class="gp">>>> </span><span class="n">value</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s2">"12.34567"</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"result: </span><span class="si">{</span><span class="n">value</span><span class="si">:{</span><span class="n">width</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">precision</span><span class="si">}}</span><span class="s2">"</span> <span class="c1"># nested fields</span>
- <span class="go">'result: 12.35'</span>
- <span class="gp">>>> </span><span class="n">today</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="mi">2017</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="mi">27</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">today</span><span class="si">:</span><span class="s2">%B %d, %Y</span><span class="si">}</span><span class="s2">"</span> <span class="c1"># using date format specifier</span>
- <span class="go">'January 27, 2017'</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">today</span><span class="si">=:</span><span class="s2">%B %d, %Y</span><span class="si">}</span><span class="s2">"</span> <span class="c1"># using date format specifier and debugging</span>
- <span class="go">'today=January 27, 2017'</span>
- <span class="gp">>>> </span><span class="n">number</span> <span class="o">=</span> <span class="mi">1024</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">number</span><span class="si">:</span><span class="s2">#0x</span><span class="si">}</span><span class="s2">"</span> <span class="c1"># using integer format specifier</span>
- <span class="go">'0x400'</span>
- <span class="gp">>>> </span><span class="n">foo</span> <span class="o">=</span> <span class="s2">"bar"</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="si">= }</span><span class="s2">"</span> <span class="c1"># preserves whitespace</span>
- <span class="go">" foo = 'bar'"</span>
- <span class="gp">>>> </span><span class="n">line</span> <span class="o">=</span> <span class="s2">"The mill's closed"</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">line</span><span class="w"> </span><span class="si">= }</span><span class="s2">"</span>
- <span class="go">'line = "The mill\'s closed"'</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">line</span><span class="w"> </span><span class="si">= :</span><span class="s2">20</span><span class="si">}</span><span class="s2">"</span>
- <span class="go">"line = The mill's closed "</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">line</span><span class="w"> </span><span class="si">= !r:</span><span class="s2">20</span><span class="si">}</span><span class="s2">"</span>
- <span class="go">'line = "The mill\'s closed" '</span>
- </pre></div>
- </div>
- <p>Reusing the outer f-string quoting type inside a replacement field is
- permitted:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="sa">f</span><span class="s2">"abc </span><span class="si">{</span><span class="n">a</span><span class="p">[</span><span class="s2">"x"</span><span class="p">]</span><span class="si">}</span><span class="s2"> def"</span>
- <span class="go">'abc 2 def'</span>
- </pre></div>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span>Prior to Python 3.12, reuse of the same quoting type of the outer f-string
- inside a replacement field was not possible.</p>
- </div>
- <p>Backslashes are also allowed in replacement fields and are evaluated the same
- way as in any other context:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"List a contains:</span><span class="se">\n</span><span class="si">{</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="go">List a contains:</span>
- <span class="go">a</span>
- <span class="go">b</span>
- <span class="go">c</span>
- </pre></div>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.12: </span>Prior to Python 3.12, backslashes were not permitted inside an f-string
- replacement field.</p>
- </div>
- <p>Formatted string literals cannot be used as docstrings, even if they do not
- include expressions.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
- <span class="gp">... </span> <span class="sa">f</span><span class="s2">"Not a docstring"</span>
- <span class="gp">...</span>
- <span class="gp">>>> </span><span class="n">foo</span><span class="o">.</span><span class="vm">__doc__</span> <span class="ow">is</span> <span class="kc">None</span>
- <span class="go">True</span>
- </pre></div>
- </div>
- <p>See also <span class="target" id="index-26"></span><a class="pep reference external" href="https://peps.python.org/pep-0498/"><strong>PEP 498</strong></a> for the proposal that added formatted string literals,
- and <a class="reference internal" href="../library/stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a>, which uses a related format string mechanism.</p>
- </section>
- <section id="numeric-literals">
- <span id="numbers"></span><h3><span class="section-number">2.4.4. </span>Numeric literals<a class="headerlink" href="#numeric-literals" title="Link to this heading">¶</a></h3>
- <p id="index-27">There are three types of numeric literals: integers, floating point numbers, and
- imaginary numbers. There are no complex literals (complex numbers can be formed
- by adding a real number and an imaginary number).</p>
- <p>Note that numeric literals do not include a sign; a phrase like <code class="docutils literal notranslate"><span class="pre">-1</span></code> is
- actually an expression composed of the unary operator ‘<code class="docutils literal notranslate"><span class="pre">-</span></code>’ and the literal
- <code class="docutils literal notranslate"><span class="pre">1</span></code>.</p>
- </section>
- <section id="integer-literals">
- <span id="integers"></span><span id="index-28"></span><h3><span class="section-number">2.4.5. </span>Integer literals<a class="headerlink" href="#integer-literals" title="Link to this heading">¶</a></h3>
- <p>Integer literals are described by the following lexical definitions:</p>
- <pre>
- <strong id="grammar-token-python-grammar-integer">integer </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-decinteger"><code class="xref docutils literal notranslate"><span class="pre">decinteger</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-bininteger"><code class="xref docutils literal notranslate"><span class="pre">bininteger</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-octinteger"><code class="xref docutils literal notranslate"><span class="pre">octinteger</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-hexinteger"><code class="xref docutils literal notranslate"><span class="pre">hexinteger</span></code></a>
- <strong id="grammar-token-python-grammar-decinteger">decinteger </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-nonzerodigit"><code class="xref docutils literal notranslate"><span class="pre">nonzerodigit</span></code></a> (["_"] <a class="reference internal" href="#grammar-token-python-grammar-digit"><code class="xref docutils literal notranslate"><span class="pre">digit</span></code></a>)* | "0"+ (["_"] "0")*
- <strong id="grammar-token-python-grammar-bininteger">bininteger </strong> ::= "0" ("b" | "B") (["_"] <a class="reference internal" href="#grammar-token-python-grammar-bindigit"><code class="xref docutils literal notranslate"><span class="pre">bindigit</span></code></a>)+
- <strong id="grammar-token-python-grammar-octinteger">octinteger </strong> ::= "0" ("o" | "O") (["_"] <a class="reference internal" href="#grammar-token-python-grammar-octdigit"><code class="xref docutils literal notranslate"><span class="pre">octdigit</span></code></a>)+
- <strong id="grammar-token-python-grammar-hexinteger">hexinteger </strong> ::= "0" ("x" | "X") (["_"] <a class="reference internal" href="#grammar-token-python-grammar-hexdigit"><code class="xref docutils literal notranslate"><span class="pre">hexdigit</span></code></a>)+
- <strong id="grammar-token-python-grammar-nonzerodigit">nonzerodigit</strong> ::= "1"..."9"
- <strong id="grammar-token-python-grammar-digit">digit </strong> ::= "0"..."9"
- <strong id="grammar-token-python-grammar-bindigit">bindigit </strong> ::= "0" | "1"
- <strong id="grammar-token-python-grammar-octdigit">octdigit </strong> ::= "0"..."7"
- <strong id="grammar-token-python-grammar-hexdigit">hexdigit </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-digit"><code class="xref docutils literal notranslate"><span class="pre">digit</span></code></a> | "a"..."f" | "A"..."F"
- </pre>
- <p>There is no limit for the length of integer literals apart from what can be
- stored in available memory.</p>
- <p>Underscores are ignored for determining the numeric value of the literal. They
- can be used to group digits for enhanced readability. One underscore can occur
- between digits, and after base specifiers like <code class="docutils literal notranslate"><span class="pre">0x</span></code>.</p>
- <p>Note that leading zeros in a non-zero decimal number are not allowed. This is
- for disambiguation with C-style octal literals, which Python used before version
- 3.0.</p>
- <p>Some examples of integer literals:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mi">7</span> <span class="mi">2147483647</span> <span class="mo">0o177</span> <span class="mb">0b100110111</span>
- <span class="mi">3</span> <span class="mi">79228162514264337593543950336</span> <span class="mo">0o377</span> <span class="mh">0xdeadbeef</span>
- <span class="mi">100_000_000_000</span> <span class="mb">0b_1110_0101</span>
- </pre></div>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.6: </span>Underscores are now allowed for grouping purposes in literals.</p>
- </div>
- </section>
- <section id="floating-point-literals">
- <span id="floating"></span><span id="index-29"></span><h3><span class="section-number">2.4.6. </span>Floating point literals<a class="headerlink" href="#floating-point-literals" title="Link to this heading">¶</a></h3>
- <p>Floating point literals are described by the following lexical definitions:</p>
- <pre>
- <strong id="grammar-token-python-grammar-floatnumber">floatnumber </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-pointfloat"><code class="xref docutils literal notranslate"><span class="pre">pointfloat</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-exponentfloat"><code class="xref docutils literal notranslate"><span class="pre">exponentfloat</span></code></a>
- <strong id="grammar-token-python-grammar-pointfloat">pointfloat </strong> ::= [<a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a>] <a class="reference internal" href="#grammar-token-python-grammar-fraction"><code class="xref docutils literal notranslate"><span class="pre">fraction</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a> "."
- <strong id="grammar-token-python-grammar-exponentfloat">exponentfloat</strong> ::= (<a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-pointfloat"><code class="xref docutils literal notranslate"><span class="pre">pointfloat</span></code></a>) <a class="reference internal" href="#grammar-token-python-grammar-exponent"><code class="xref docutils literal notranslate"><span class="pre">exponent</span></code></a>
- <strong id="grammar-token-python-grammar-digitpart">digitpart </strong> ::= <a class="reference internal" href="#grammar-token-python-grammar-digit"><code class="xref docutils literal notranslate"><span class="pre">digit</span></code></a> (["_"] <a class="reference internal" href="#grammar-token-python-grammar-digit"><code class="xref docutils literal notranslate"><span class="pre">digit</span></code></a>)*
- <strong id="grammar-token-python-grammar-fraction">fraction </strong> ::= "." <a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a>
- <strong id="grammar-token-python-grammar-exponent">exponent </strong> ::= ("e" | "E") ["+" | "-"] <a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a>
- </pre>
- <p>Note that the integer and exponent parts are always interpreted using radix 10.
- For example, <code class="docutils literal notranslate"><span class="pre">077e010</span></code> is legal, and denotes the same number as <code class="docutils literal notranslate"><span class="pre">77e10</span></code>. The
- allowed range of floating point literals is implementation-dependent. As in
- integer literals, underscores are supported for digit grouping.</p>
- <p>Some examples of floating point literals:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mf">3.14</span> <span class="mf">10.</span> <span class="mf">.001</span> <span class="mf">1e100</span> <span class="mf">3.14e-10</span> <span class="mf">0e0</span> <span class="mf">3.14_15_93</span>
- </pre></div>
- </div>
- <div class="versionchanged">
- <p><span class="versionmodified changed">Changed in version 3.6: </span>Underscores are now allowed for grouping purposes in literals.</p>
- </div>
- </section>
- <section id="imaginary-literals">
- <span id="imaginary"></span><span id="index-30"></span><h3><span class="section-number">2.4.7. </span>Imaginary literals<a class="headerlink" href="#imaginary-literals" title="Link to this heading">¶</a></h3>
- <p>Imaginary literals are described by the following lexical definitions:</p>
- <pre>
- <strong id="grammar-token-python-grammar-imagnumber">imagnumber</strong> ::= (<a class="reference internal" href="#grammar-token-python-grammar-floatnumber"><code class="xref docutils literal notranslate"><span class="pre">floatnumber</span></code></a> | <a class="reference internal" href="#grammar-token-python-grammar-digitpart"><code class="xref docutils literal notranslate"><span class="pre">digitpart</span></code></a>) ("j" | "J")
- </pre>
- <p>An imaginary literal yields a complex number with a real part of 0.0. Complex
- numbers are represented as a pair of floating point numbers and have the same
- restrictions on their range. To create a complex number with a nonzero real
- part, add a floating point number to it, e.g., <code class="docutils literal notranslate"><span class="pre">(3+4j)</span></code>. Some examples of
- imaginary literals:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mf">3.14</span><span class="n">j</span> <span class="mf">10.</span><span class="n">j</span> <span class="mi">10</span><span class="n">j</span> <span class="mf">.001</span><span class="n">j</span> <span class="mf">1e100j</span> <span class="mf">3.14e-10</span><span class="n">j</span> <span class="mf">3.14_15_93</span><span class="n">j</span>
- </pre></div>
- </div>
- </section>
- </section>
- <section id="operators">
- <span id="id14"></span><h2><span class="section-number">2.5. </span>Operators<a class="headerlink" href="#operators" title="Link to this heading">¶</a></h2>
- <p id="index-31">The following tokens are operators:</p>
- <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>+ - * ** / // % @
- << >> & | ^ ~ :=
- < > <= >= == !=
- </pre></div>
- </div>
- </section>
- <section id="delimiters">
- <span id="id15"></span><h2><span class="section-number">2.6. </span>Delimiters<a class="headerlink" href="#delimiters" title="Link to this heading">¶</a></h2>
- <p id="index-32">The following tokens serve as delimiters in the grammar:</p>
- <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>( ) [ ] { }
- , : . ; @ = ->
- += -= *= /= //= %= @=
- &= |= ^= >>= <<= **=
- </pre></div>
- </div>
- <p>The period can also occur in floating-point and imaginary literals. A sequence
- of three periods has a special meaning as an ellipsis literal. The second half
- of the list, the augmented assignment operators, serve lexically as delimiters,
- but also perform an operation.</p>
- <p>The following printing ASCII characters have special meaning as part of other
- tokens or are otherwise significant to the lexical analyzer:</p>
- <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>' " # \
- </pre></div>
- </div>
- <p>The following printing ASCII characters are not used in Python. Their
- occurrence outside string literals and comments is an unconditional error:</p>
- <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ ? `
- </pre></div>
- </div>
- <p class="rubric">Footnotes</p>
- <aside class="footnote-list brackets">
- <aside class="footnote brackets" id="id16" role="doc-footnote">
- <span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id12">1</a><span class="fn-bracket">]</span></span>
- <p><a class="reference external" href="https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt">https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt</a></p>
- </aside>
- </aside>
- </section>
- </section>
-
-
- <div class="clearer"></div>
- </div>
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper">
- <div>
- <h3><a href="../contents.html">Table of Contents</a></h3>
- <ul>
- <li><a class="reference internal" href="#">2. Lexical analysis</a><ul>
- <li><a class="reference internal" href="#line-structure">2.1. Line structure</a><ul>
- <li><a class="reference internal" href="#logical-lines">2.1.1. Logical lines</a></li>
- <li><a class="reference internal" href="#physical-lines">2.1.2. Physical lines</a></li>
- <li><a class="reference internal" href="#comments">2.1.3. Comments</a></li>
- <li><a class="reference internal" href="#encoding-declarations">2.1.4. Encoding declarations</a></li>
- <li><a class="reference internal" href="#explicit-line-joining">2.1.5. Explicit line joining</a></li>
- <li><a class="reference internal" href="#implicit-line-joining">2.1.6. Implicit line joining</a></li>
- <li><a class="reference internal" href="#blank-lines">2.1.7. Blank lines</a></li>
- <li><a class="reference internal" href="#indentation">2.1.8. Indentation</a></li>
- <li><a class="reference internal" href="#whitespace-between-tokens">2.1.9. Whitespace between tokens</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#other-tokens">2.2. Other tokens</a></li>
- <li><a class="reference internal" href="#identifiers">2.3. Identifiers and keywords</a><ul>
- <li><a class="reference internal" href="#keywords">2.3.1. Keywords</a></li>
- <li><a class="reference internal" href="#soft-keywords">2.3.2. Soft Keywords</a></li>
- <li><a class="reference internal" href="#reserved-classes-of-identifiers">2.3.3. Reserved classes of identifiers</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#literals">2.4. Literals</a><ul>
- <li><a class="reference internal" href="#string-and-bytes-literals">2.4.1. String and Bytes literals</a><ul>
- <li><a class="reference internal" href="#escape-sequences">2.4.1.1. Escape sequences</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#string-literal-concatenation">2.4.2. String literal concatenation</a></li>
- <li><a class="reference internal" href="#formatted-string-literals">2.4.3. f-strings</a></li>
- <li><a class="reference internal" href="#numeric-literals">2.4.4. Numeric literals</a></li>
- <li><a class="reference internal" href="#integer-literals">2.4.5. Integer literals</a></li>
- <li><a class="reference internal" href="#floating-point-literals">2.4.6. Floating point literals</a></li>
- <li><a class="reference internal" href="#imaginary-literals">2.4.7. Imaginary literals</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#operators">2.5. Operators</a></li>
- <li><a class="reference internal" href="#delimiters">2.6. Delimiters</a></li>
- </ul>
- </li>
- </ul>
-
- </div>
- <div>
- <h4>Previous topic</h4>
- <p class="topless"><a href="introduction.html"
- title="previous chapter"><span class="section-number">1. </span>Introduction</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="datamodel.html"
- title="next chapter"><span class="section-number">3. </span>Data model</a></p>
- </div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="../bugs.html">Report a Bug</a></li>
- <li>
- <a href="https://github.com/python/cpython/blob/main/Doc/reference/lexical_analysis.rst"
- rel="nofollow">Show Source
- </a>
- </li>
- </ul>
- </div>
- </div>
- <div id="sidebarbutton" title="Collapse sidebar">
- <span>«</span>
- </div>
-
- </div>
- <div class="clearer"></div>
- </div>
- <div class="related" role="navigation" aria-label="related navigation">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="../genindex.html" title="General Index"
- >index</a></li>
- <li class="right" >
- <a href="../py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li class="right" >
- <a href="datamodel.html" title="3. Data model"
- >next</a> |</li>
- <li class="right" >
- <a href="introduction.html" title="1. Introduction"
- >previous</a> |</li>
-
- <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
- <li><a href="https://www.python.org/">Python</a> »</li>
- <li class="switchers">
- <div class="language_switcher_placeholder"></div>
- <div class="version_switcher_placeholder"></div>
- </li>
- <li>
-
- </li>
- <li id="cpython-language-and-version">
- <a href="../index.html">3.12.3 Documentation</a> »
- </li>
-
- <li class="nav-item nav-item-1"><a href="index.html" >The Python Language Reference</a> »</li>
- <li class="nav-item nav-item-this"><a href=""><span class="section-number">2. </span>Lexical analysis</a></li>
- <li class="right">
-
-
- <div class="inline-search" role="search">
- <form class="inline-search" action="../search.html" method="get">
- <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
- <input type="submit" value="Go" />
- </form>
- </div>
- |
- </li>
- <li class="right">
- <label class="theme-selector-label">
- Theme
- <select class="theme-selector" oninput="activateTheme(this.value)">
- <option value="auto" selected>Auto</option>
- <option value="light">Light</option>
- <option value="dark">Dark</option>
- </select>
- </label> |</li>
-
- </ul>
- </div>
- <div class="footer">
- ©
- <a href="../copyright.html">
-
- Copyright
-
- </a>
- 2001-2024, Python Software Foundation.
- <br />
- This page is licensed under the Python Software Foundation License Version 2.
- <br />
- Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
- <br />
-
- See <a href="/license.html">History and License</a> for more information.<br />
-
-
- <br />
-
- The Python Software Foundation is a non-profit corporation.
- <a href="https://www.python.org/psf/donations/">Please donate.</a>
- <br />
- <br />
- Last updated on Apr 09, 2024 (13:47 UTC).
-
- <a href="/bugs.html">Found a bug</a>?
-
- <br />
-
- Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.2.6.
- </div>
-
- </body>
- </html>
|