2. 字句解析
***********

Python で書かれたプログラムは *パーザ (parser)* に読み込まれます。パー
ザへの入力は、 *字句解析器 (lexical analyzer)* によって生成された一連
の *トークン (token)* からなります。この章では、字句解析器がファイルを
トークン列に分解する方法について解説します。

Python はプログラムテキストを Unicode コードポイントとして読み込みます
。ソースファイルのエンコーディングはエンコーディング宣言で与えられ、デ
フォルトは UTF-8  です。詳細は **PEP 3120** を参照してください。ソース
ファイルがデコードできなければ、 "SyntaxError" が送出されます。


2.1. 行構造
===========

Python プログラムは多数の *論理行 (logical lines)* に分割されます。


2.1.1. 論理行 (logical line)
----------------------------

論理行の終端は、トークン NEWLINE で表されます。構文上許されている場合
(複合文: compound statement 中の実行文: statement) を除いて、実行文は
論理行間にまたがることはできません。論理行は一行またはそれ以上の *物理
行(physical line)* からなり、物理行の末尾には明示的または非明示的な *
行連結(line joining)* 規則が続きます。


2.1.2. 物理行 (physical line)
-----------------------------

物理行とは、行終端コードで区切られた文字列のことです。 ソースファイル
やソース文字列では、各プラットフォームごとの標準の行終端コードを使用す
ることができます。 Unix形式ではASCII LF (行送り: linefeed)文字、
Windows形式ではASCII 配列の CR LF (復帰: return に続いて行送り) 、
Macintosh形式ではASCII CR (復帰) 文字です。 これら全ての形式のコードは
、違うプラットフォームでも等しく使用することができます。 入力の末尾も
、最後の物理行の暗黙的な終端としての役割を果たします。

Pythonに埋め込む場合には、標準のC言語の改行文字の変換規則 (ASCII LFを
表現した文字コード "\n" が行終端となります) に従って、 Python APIにソ
ースコードを渡す必要があります。


2.1.3. コメント (Comments)
--------------------------

コメントは文字列リテラル内に入っていないハッシュ文字 ("#") から始まり
、同じ物理行の末端で終わります。 非明示的な行継続規則が適用されていな
い限り、コメントは論理行を終端させます。 コメントは構文上無視されます
。


2.1.4. エンコード宣言 (encoding declaration)
--------------------------------------------

Python スクリプト中の一行目か二行目にあるコメントが正規表現
"coding[=:]\s*([-\w.]+)" にマッチする場合、コメントはエンコード宣言と
して処理されます; この表現の最初のグループがソースコードファイルのエン
コードを指定します。エンコード宣言は自身の行になければなりません。二行
目にある場合、一行目もコメントのみの行でなければなりません。エンコード
宣言式として推奨する形式は

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

これは GNU Emacs で認識できます。または

   # vim:fileencoding=<encoding-name>

これは、Bram Moolenar による VIM が認識できる形式です。

If no encoding declaration is found, the default encoding is UTF-8.
If the implicit or explicit encoding of a file is UTF-8, an initial
UTF-8 byte-order mark (b'xefxbbxbf') is ignored rather than being a
syntax error.

エンコーディングが宣言される場合、そのエンコーディング名は Python によ
って認識できなければなりません (標準エンコーディング を参照してくださ
い)。宣言されたエンコーディングは、例えば文字列リテラル、コメント、識
別子などの、全ての字句解析に使われます。


2.1.5. 明示的な行継続
---------------------

二つまたはそれ以上の物理行を論理行としてつなげるためには、バックスラッ
シュ文字 ("\") を使って以下のようにします: 物理行が文字列リテラルやコ
メント中の文字でないバックスラッシュで終わっている場合、後続する行とつ
なげて一つの論理行を構成し、バックスラッシュおよびバックスラッシュの後
ろにある行末文字を削除します。例えば:

   if 1900 < year < 2100 and 1 <= month <= 12 \
      and 1 <= day <= 31 and 0 <= hour < 24 \
      and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
           return 1

バックスラッシュで終わる行にはコメントを入れることはできません。また、
バックスラッシュを使ってコメントを継続することはできません。バックスラ
ッシュが文字列リテラル中にある場合を除き、バックスラッシュの後ろにトー
クンを継続することはできません (すなわち、物理行内の文字列リテラル以外
のトークンをバックスラッシュを使って分断することはできません)。上記以
外の場所では、文字列リテラル外にあるバックスラッシュはどこにあっても不
正となります。


2.1.6. 非明示的な行継続
-----------------------

丸括弧 (parentheses)、角括弧 (square bracket) 、および波括弧 (curly
brace) 内の式は、バックスラッシュを使わずに一行以上の物理行に分割する
ことができます。例えば:

   month_names = ['Januari', 'Februari', 'Maart',      # These are the
                  'April',   'Mei',      'Juni',       # Dutch names
                  'Juli',    'Augustus', 'September',  # for the months
                  'Oktober', 'November', 'December']   # of the year

非明示的に継続された行にはコメントを含めることができます。継続行のイン
デントは重要ではありません。空の継続行を書くことができます。非明示的な
継続行中には、NEWLINE トークンは存在しません。非明示的な行の継続は、三
重クオートされた文字列 (下記参照) でも発生します; この場合には、コメン
トを含めることができません。


2.1.7. 空行
-----------

スペース、タブ、フォームフィード、およびコメントのみを含む論理行は無視
されます (すなわち、NEWLINE トークンは生成されません)。文を対話的に入
力している際には、空行の扱いは行読み込み-評価-出力 (read-eval-print)
ループの実装によって異なることがあります。標準的な対話的インタプリタの
実装では、完全な空行でできた論理行 (すなわち、空白文字もコメントも全く
含まない空行) は、複数行からなる文の終端を示します。


2.1.8. インデント
-----------------

論理行の行頭にある、先頭の空白 (スペースおよびタブ) の連なりは、その行
のインデントレベルを計算するために使われます。インデントレベルは、実行
文のグループ化方法を決定するために用いられます。

タブは (左から右の方向に) 1 つにつき 8 つのスペースで置き換えられ、置
き換え後の文字数は 8 の倍数になります (Unix で使われている規則と同じに
なるよう意図されています)。そして、最初の非空白文字までのスペースの総
数が、その行のインデントを決定します。インデントは、バックスラッシュで
複数の物理行に分割できません; 最初のバックスラッシュまでの空白がインデ
ントを決定します。

ソースファイルがタブとスペースを混在させ、その意味づけがタブのスペース
換算数に依存するようなら、インデントは不合理なものとして却下されます。
その場合は "TabError" が送出されます。

**プラットフォーム間の互換性に関する注意:** 非 UNIX プラットフォームに
おけるテキストエディタの性質上、一つのソースファイル内でタブとインデン
トを混在させて使うのは賢明ではありません。また、プラットフォームによっ
ては、最大インデントレベルを明示的に制限しているかもしれません。

フォームフィード文字が行の先頭にあっても構いません; フォームフィード文
字は上のインデントレベル計算時には無視されます。フォームフィード文字が
先頭の空白中の他の場所にある場合、その影響は未定義です (例えば、スペー
スの数を 0 にリセットするかもしれません)。

連続する行における各々のインデントレベルは、 INDENT および DEDENT トー
クンを生成するために使われます。トークンの生成はスタックを用いて以下の
ように行われます。

ファイル中の最初の行を読み出す前に、スタックにゼロが一つ積まれ (push
され) ます; このゼロは決して除去 (pop) されることはありません。スタッ
クの先頭に積まれてゆく数字は、常にスタックの末尾から先頭にかけて厳密に
増加するようになっています。各論理行の開始位置において、その行のインデ
ントレベル値がスタックの先頭の値と比較されます。値が等しければ何もしま
せん。インデントレベル値がスタック上の値よりも大きければ、インデントレ
ベル値はスタックに積まれ、INDENT トークンが一つ生成されます。インデン
トレベル値がスタック上の値よりも小さい場合、その値はスタック内のいずれ
かの値と *等しくなければなりません* ; スタック上のインデントレベル値よ
りも大きい値はすべて除去され、値が一つ除去されるごとに DEDENT トークン
が一つ生成されます。ファイルの末尾では、スタックに残っているゼロより大
きい値は全て除去され、値が一つ除去されるごとに DEDENT トークンが一つ生
成されます。

以下の例に正しく (しかし当惑させるように) インデントされた Python コー
ドの一部を示します:

   def perm(l):
           # Compute the list of all permutations of l
       if len(l) <= 1:
                     return [l]
       r = []
       for i in range(len(l)):
                s = l[:i] + l[i+1:]
                p = perm(s)
                for x in p:
                 r.append(l[i:i+1] + x)
       return r

以下の例は、様々なインデントエラーになります:

    def perm(l):                       # error: first line indented
   for i in range(len(l)):             # error: not indented
       s = l[:i] + l[i+1:]
           p = perm(l[:i] + l[i+1:])   # error: unexpected indent
           for x in p:
                   r.append(l[i:i+1] + x)
               return r                # error: inconsistent dedent

(実際は、最初の 3 つのエラーはパーザによって検出されます; 最後のエラー
のみが字句解析器で見つかります --- "return r" のインデントは、スタック
から逐次除去されていくどのインデントレベル値とも一致しません)


2.1.9. トークン間の空白
-----------------------

論理行の先頭や文字列の内部にある場合を除き、空白文字であるスペース、タ
ブ、およびフォームフィードは、トークンを分割するために自由に利用するこ
とができます。二つのトークンを並べて書くと別のトークンとしてみなされて
しまうような場合には、トークンの間に空白が必要となります (例えば、ab
は一つのトークンですが、 a b は二つのトークンとなります)。


2.2. その他のトークン
=====================

NEWLINE、INDENT、および DEDENT の他、以下のトークンのカテゴリ: *識別子
(identifier)*, *キーワード(keyword)*, *リテラル*, *演算子 (operator)*,
*デリミタ (delimiter)* が存在します。空白文字 (上で述べた行終端文字以
外) はトークンではありませんが、トークンを区切る働きがあります。トーク
ンの解析にあいまいさが生じた場合、トークンは左から右に読んで不正でない
トークンを構築できる最長の文字列を含むように構築されます。


2.3. 識別子 (identifier) およびキーワード (keyword)
===================================================

識別子 (または *名前 (name)*) は、以下の字句定義で記述されます。

Python における識別子の構文は、Unicode 標準仕様添付書類 UAX-31 に基づ
き、詳細と変更点は以下で定義します。詳しくは **PEP 3131** を参照してく
ださい。

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

識別子の長さには制限がありません。大小文字は区別されます。

   identifier   ::= xid_start xid_continue*
   id_start     ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
   id_continue  ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
   xid_start    ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
   xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">

上で言及した Unicode カテゴリコードは以下を表します:

* *Lu* - 大文字 (uppercase letters)

* *Ll* - 小文字 (lowercase letters)

* *Lt* - 先頭が大文字 (titlecase letters)

* *Lm* - 修飾文字 (modifier letters)

* *Lo* - その他の文字 (other letters)

* *Nl* - 数値を表す文字 (letter numbers)

* *Mn* - 字幅のない記号 (nonspacing marks)

* *Mc* - 字幅のある結合記号 (spacing combining marks)

* *Nd* - 10 進数字 (decimal numbers)

* *Pc* - 連結用句読記号 (connector punctuations)

* *Other_ID_Start* - explicit list of characters in PropList.txt to
  support backwards compatibility

* *Other_ID_Continue* - 同様

すべての識別子は、解析中は正規化形式 NFKC に変換されます。識別子間の比
較は NFKC に基づきます。

A non-normative HTML file listing all valid identifier characters for
Unicode 15.0.0 can be found at
https://www.unicode.org/Public/15.0.0/ucd/DerivedCoreProperties.txt


2.3.1. キーワード (keyword)
---------------------------

以下の識別子は、予約語、または Python 言語における *キーワード
(keyword)* として使われ、通常の識別子として使うことはできません。キー
ワードは厳密に下記の通りに綴らなければなりません:

   False      await      else       import     pass
   None       break      except     in         raise
   True       class      finally    is         return
   and        continue   for        lambda     try
   as         def        from       nonlocal   while
   assert     del        global     not        with
   async      elif       if         or         yield


2.3.2. ソフトキーワード
-----------------------

Added in version 3.10.

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

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

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

バージョン 3.12 で変更: "type" is now a soft keyword.


2.3.3. 予約済みの識別子種 (reserved classes of identifiers)
-----------------------------------------------------------

ある種の (キーワードを除く) 識別子には、特殊な意味があります。これらの
識別子種は、先頭や末尾にあるアンダースコア文字のパターンで区別されます
:

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

"_"
   In a "case" pattern within a "match" statement, "_" is a soft
   keyword that denotes a wildcard.

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

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

   注釈:

     名前 "_" は、しばしば国際化 (internationalization) と共に用いられ
     ます; この慣習についての詳しい情報は、 "gettext" を参照してくださ
     い。It is also commonly used for unused variables.

"__*__"
   システムで定義された (system-defined) 名前です。非公式には"dunder"
   な名前と呼ばれます(訳注: double underscoresの略)。これらの名前はイ
   ンタープリタと (標準ライブラリを含む) 実装上で定義されています。 現
   行のシステムでの名前は 特殊メソッド名 などで話題に挙げられています
   。 Python の将来のバージョンではより多くの名前が定義されることにな
   ります。このドキュメントで明記されている用法に従わない、 *あらゆる*
   "__*__" の名前は、いかなるコンテキストにおける利用でも、警告無く損
   害を引き起こすことがあります。

"__*"
   クラスプライベート (class-private) な名前です。このカテゴリに属する
   名前は、クラス定義のコンテキスト上で用いられた場合、基底クラスと派
   生クラスの "プライベートな" 属性間で名前衝突が起こるのを防ぐために
   書き直されます。 識別子 (identifier、または名前 (name)) を参照して
   ください。


2.4. リテラル
=============

リテラル (literal) とは、いくつかの組み込み型の定数を表記したものです
。


2.4.1. 文字列およびバイト列リテラル
-----------------------------------

文字列リテラルは以下の字句定義で記述されます:

   stringliteral   ::= [stringprefix](shortstring | longstring)
   stringprefix    ::= "r" | "u" | "R" | "U" | "f" | "F"
                    | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
   shortstring     ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
   longstring      ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
   shortstringitem ::= shortstringchar | stringescapeseq
   longstringitem  ::= longstringchar | stringescapeseq
   shortstringchar ::= <any source character except "\" or newline or the quote>
   longstringchar  ::= <any source character except "\">
   stringescapeseq ::= "\" <any source character>

   bytesliteral   ::= bytesprefix(shortbytes | longbytes)
   bytesprefix    ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
   shortbytes     ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
   longbytes      ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
   shortbytesitem ::= shortbyteschar | bytesescapeseq
   longbytesitem  ::= longbyteschar | bytesescapeseq
   shortbyteschar ::= <any ASCII character except "\" or newline or the quote>
   longbyteschar  ::= <any ASCII character except "\">
   bytesescapeseq ::= "\" <any ASCII character>

上記の生成規則で示されていない文法的な制限が一つあります。リテラルの
"stringprefix" や "bytesprefix" と残りの部分の間に空白を入れてはならな
いことです。ソースコード文字セット (source character set) はエンコーデ
ィング宣言で定義されます。エンコーディング宣言がなければ UTF-8 です。
節 エンコード宣言 (encoding declaration) を参照してください。

In plain English: Both types of literals can be enclosed in matching
single quotes ("'") or double quotes (""").  They can also be enclosed
in matching groups of three single or double quotes (these are
generally referred to as *triple-quoted strings*). The backslash ("\")
character is used to give special meaning to otherwise ordinary
characters like "n", which means 'newline' when escaped ("\n"). It can
also be used to escape characters that otherwise have a special
meaning, such as newline, backslash itself, or the quote character.
See escape sequences below for examples.

バイト列リテラルには、常に "'b'" や "'B'" が接頭します。これらによって
、 "str" 型ではなく "bytes" 型のインスタンスが作成されます。バイト列リ
テラルは ASCII 文字のみ含むことができます。 128 以上の数値を持つバイト
はエスケープして表されなければなりません。

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

Added in version 3.3: raw バイト列リテラルの "'rb'" プレフィックスが
"'br'" の同義語として追加されました。Python 2.x と 3.x 両対応のコード
ベースのメンテナンスを単純化するために、レガシー unicode リテラル
("u'value'") のサポートが再び導入されました。詳細は **PEP 414** を参照
してください。

"'f'" または "'F'" の接頭辞が付いた文字列リテラルはフォーマット済み文
字列リテラル（ *formatted string literal* ）です。詳細については フォ
ーマット済み文字列リテラル を参照してください。接頭辞の "'f'" は "'r'"
と組み合わせられますが、 "'b'" や "'u'" と組み合わせることはできません
。つまりフォーマット済みの raw 文字列リテラルは可ですが、フォーマット
済みのバイト列リテラルは不可です。

三重クオートリテラル中には、三連のエスケープされないクオート文字でリテ
ラルを終端してしまわないかぎり、エスケープされていない改行やクオートを
書くことができます (さらに、それらはそのまま文字列中に残ります)。(ここ
でいう "クオート" とは、文字列の囲みを開始するときに使った文字を示し、
"'" か """ のいずれかです。)


2.4.1.1. Escape sequences
~~~~~~~~~~~~~~~~~~~~~~~~~

"'r'" または "'R'" 接頭文字がつかないかぎり、文字列またはバイト列リテ
ラル中のエスケープシーケンスは標準 C で使われているのと同様の法則にし
たがって解釈されます。以下に Python で認識されるエスケープシーケンスを
示します:

+---------------------------+-----------------------------------+---------+
| エスケープシーケンス      | 意味                              | 注釈    |
|===========================|===================================|=========|
| "\"<newline>              | バックスラッシュと改行文字が無視  | (1)     |
|                           | されます                          |         |
+---------------------------+-----------------------------------+---------+
| "\\"                      | バックスラッシュ ("\")            |         |
+---------------------------+-----------------------------------+---------+
| "\'"                      | 一重引用符 ("'")                  |         |
+---------------------------+-----------------------------------+---------+
| "\""                      | 二重引用符 (""")                  |         |
+---------------------------+-----------------------------------+---------+
| "\a"                      | ASCII 端末ベル (BEL)              |         |
+---------------------------+-----------------------------------+---------+
| "\b"                      | ASCII バックスペース (BS)         |         |
+---------------------------+-----------------------------------+---------+
| "\f"                      | ASCII フォームフィード (FF)       |         |
+---------------------------+-----------------------------------+---------+
| "\n"                      | ASCII 行送り (LF)                 |         |
+---------------------------+-----------------------------------+---------+
| "\r"                      | ASCII 復帰 (CR)                   |         |
+---------------------------+-----------------------------------+---------+
| "\t"                      | ASCII 水平タブ (TAB)              |         |
+---------------------------+-----------------------------------+---------+
| "\v"                      | ASCII 垂直タブ (VT)               |         |
+---------------------------+-----------------------------------+---------+
| "\*ooo*"                  | 8 進数値 *ooo* を持つ文字         | (2,4)   |
+---------------------------+-----------------------------------+---------+
| "\x*hh*"                  | 16 進数値 *hh* を持つ文字         | (3,4)   |
+---------------------------+-----------------------------------+---------+

文字列でのみ認識されるエスケープシーケンスは以下のとおりです:

+---------------------------+-----------------------------------+---------+
| エスケープシーケンス      | 意味                              | 注釈    |
|===========================|===================================|=========|
| "\N{*name*}"              | Unicode データベース中で *name*   | (5)     |
|                           | という名前の文字                  |         |
+---------------------------+-----------------------------------+---------+
| "\u*xxxx*"                | 16-bit の十六進値 *xxxx* を持つ文 | (6)     |
|                           | 字                                |         |
+---------------------------+-----------------------------------+---------+
| "\U*xxxxxxxx*"            | 32-bit の十六進値 *xxxxxxxx* を持 | (7)     |
|                           | つ文字                            |         |
+---------------------------+-----------------------------------+---------+

注釈:

1. A backslash can be added at the end of a line to ignore the
   newline:

      >>> 'This string will not include \
      ... backslashes or newline characters.'
      'This string will not include backslashes or newline characters.'

   The same result can be achieved using triple-quoted strings, or
   parentheses and string literal concatenation.

2. 標準 C と同じく、最大で 3 桁の 8 進数まで受理します。

   バージョン 3.11 で変更: Octal escapes with value larger than
   "0o377" produce a "DeprecationWarning".

   バージョン 3.12 で変更: Octal escapes with value larger than
   "0o377" produce a "SyntaxWarning". In a future Python version they
   will be eventually a "SyntaxError".

3. 標準 C とは違い、ちょうど 2 桁の 16 進数しか受理されません。

4. バイト列リテラル中では、十六進および八進エスケープは与えられた値の
   バイトを表します。文字列リテラル中では、エスケープ文字は与えられた
   値を持つ Unicode 文字を表します。

5. バージョン 3.3 で変更: name aliases [1] に対するサポートが追加され
   ました。

6. ちょうど 4 桁の 16 進数しか受理されません。

7. あらゆるユニコード文字はこのようにしてエンコードすることができます
   。正確に8文字の16進数字が必要です。

標準の C とは違い、認識されなかったエスケープシーケンスはすべて、その
まま文字列中に残ります。すなわち、*バックスラッシュも結果中に残ります*
。(この挙動はデバッグの際に便利です: エスケープシーケンスが誤入力され
たら、その出力結果が失敗しているのが分かりやすくなります。) 文字列中で
のみ認識されるエスケープシーケンスは、バイト列リテラルには、認識されな
いエスケープシーケンスとして分類されるので注意してください。

バージョン 3.6 で変更: Unrecognized escape sequences produce a
"DeprecationWarning".

バージョン 3.12 で変更: Unrecognized escape sequences produce a
"SyntaxWarning". In a future Python version they will be eventually a
"SyntaxError".

raw リテラルでも、引用符はバックスラッシュでエスケープできますが、バッ
クスラッシュ自体も文字列に残ります; 例えば、"r"\""" は有効な文字列リテ
ラルで、バックスラッシュと二重引用符からなる文字列を表します; "r"\""
は無効な文字列リテラルです (raw リテラルを奇数個連なったバックスラッシ
ュで終わらせることはできません)。具体的には、(バックスラッシュが直後の
クオート文字をエスケープしてしまうので)  *raw文字列を単一のバックスラ
ッシュで終わらせることはできません* さらに、バックスラッシュの直後に改
行がきても、行継続を意味する *のではなく*、リテラルの一部であるそれら
二つの文字として解釈されます。


2.4.2. 文字列リテラルの結合 (concatenation)
-------------------------------------------

文字列やバイト列リテラルは、互いに異なる引用符を使っていても (空白文字
で区切っても) 複数隣接させることができます。これは各々の文字列を結合す
るのと同じ意味を持ちます。したがって、""hello" 'world'" は
""helloworld"" と同じです。この機能を使うと、バックスラッシュを減らし
たり、長い文字列を手軽に分離して複数行にまたがらせたり、あるいは部分文
字列ごとにコメントを追加することさえできます。例えば:

   re.compile("[A-Za-z_]"       # letter or underscore
              "[A-Za-z0-9_]*"   # letter, digit or underscore
             )

この機能は文法レベルで定義されていますが、スクリプトをコンパイルする際
の処理として実現されることに注意してください。実行時に文字列表現を結合
したければ、 '+' 演算子を使わなければなりません。また、リテラルの結合
においては、結合する各要素に異なる引用符形式を使ったり (raw 文字列と三
重引用符を混ぜることさえできます) 、フォーマット済み文字列リテラルと通
常の文字列リテラルを結合したりすることもできますので注意してください。


2.4.3. f-strings
----------------

Added in version 3.6.

フォーマット済み文字列リテラル（ *formatted string literal* ）または
*f-string* は、接頭辞 "'f'" または "'F'" の付いた文字列リテラルです。
これらの文字列には、波括弧 "{}" で区切られた式である置換フィールドを含
めることができます。他の文字列リテラルの場合は内容が常に一定で変わるこ
とが無いのに対して、フォーマット済み文字列リテラルは実行時に式として評
価されます。

エスケープシーケンスは通常の文字列リテラルと同様にデコードされます (た
だしリテラルが raw 文字列でもある場合は除きます) 。エスケープシーケン
スをデコードした後は、文字列の内容は次の文法で解釈されます:

   f_string          ::= (literal_char | "{{" | "}}" | replacement_field)*
   replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"
   f_expression      ::= (conditional_expression | "*" or_expr)
                      ("," conditional_expression | "," "*" or_expr)* [","]
                    | yield_expression
   conversion        ::= "s" | "r" | "a"
   format_spec       ::= (literal_char | replacement_field)*
   literal_char      ::= <any code point except "{", "}" or NULL>

文字列のうち、波括弧で囲まれた部分以外は文字通り解釈されます。ただし、
二重波括弧 "'{{'" および "'}}'" は単一の波括弧に置き換えられます。単一
の開き波括弧 "'{'" は置換フィールドの始まりを意味し、その中身は Python
の式で始まります。(デバッグ時に便利な機能として) 式のテキストと、評価
後の値との両者を表示したい場合には、式の後に等号 "'='" を加えてくださ
い。その後ろには、感嘆符 "'!'" によって導入される変換フィールドを続け
ることができます。さらに、"':'" に続いて書式指定子を追加できます。置換
フィールドは単一の閉じ波括弧 "'}'" で終わります。

Expressions in formatted string literals are treated like regular
Python expressions surrounded by parentheses, with a few exceptions.
An empty expression is not allowed, and both "lambda"  and assignment
expressions ":=" must be surrounded by explicit parentheses. Each
expression is evaluated in the context where the formatted string
literal appears, in order from left to right.  Replacement expressions
can contain newlines in both single-quoted and triple-quoted f-strings
and they can contain comments.  Everything that comes after a "#"
inside a replacement field is a comment (even closing braces and
quotes). In that case, replacement fields must be closed in a
different line.

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

バージョン 3.7 で変更: Python 3.7 より前のバージョンでは、"await" 式お
よび "async for" 句を含む内包表記は、実装に伴う問題の都合により許され
ていませんでした。

バージョン 3.12 で変更: Prior to Python 3.12, comments were not
allowed inside f-string replacement fields.

等号 "'='" が指定されたとき、出力文字列は、式のテキスト表現、等号
"'='"、および評価された式を含みます。開き波括弧 "'{'" の直後、式の中、
および "'='" の後に含まれる空白文字はすべて保存されます。書式指定子が
存在しない限り、"'='" を指定した場合は、式に対して "repr()" を適用した
結果が出力になります。一方、書式指定子が存在する場合は、変換フィールド
で "'!r'" が指定されていない限り、デフォルトで "str()" が適用されます
。

Added in version 3.8: 等号 "'='"。

もし変換フィールドが指定されていた場合、式の評価結果はフォーマットの前
に変換されます。変換 "'!s'" は "str()" を、 "'!r'" は "repr()" を、そ
して "'!a'" は "ascii()" を呼び出します。

The result is then formatted using the "format()" protocol.  The
format specifier is passed to the "__format__()" method of the
expression or conversion result.  An empty string is passed when the
format specifier is omitted.  The formatted result is then included in
the final value of the whole string.

Top-level format specifiers may include nested replacement fields.
These nested fields may include their own conversion fields and format
specifiers, but may not include more deeply nested replacement fields.
The format specifier mini-language is the same as that used by the
"str.format()" method.

フォーマット済み文字列リテラルは他の文字列リテラルと結合できますが、置
換フィールドを複数のリテラルに分割して書くことはできません。

フォーマット済み文字列リテラルの例をいくつか挙げます:

   >>> name = "Fred"
   >>> f"He said his name is {name!r}."
   "He said his name is 'Fred'."
   >>> f"He said his name is {repr(name)}."  # repr() is equivalent to !r
   "He said his name is 'Fred'."
   >>> width = 10
   >>> precision = 4
   >>> value = decimal.Decimal("12.34567")
   >>> f"result: {value:{width}.{precision}}"  # nested fields
   'result:      12.35'
   >>> today = datetime(year=2017, month=1, day=27)
   >>> f"{today:%B %d, %Y}"  # using date format specifier
   'January 27, 2017'
   >>> f"{today=:%B %d, %Y}" # using date format specifier and debugging
   'today=January 27, 2017'
   >>> number = 1024
   >>> f"{number:#0x}"  # using integer format specifier
   '0x400'
   >>> foo = "bar"
   >>> f"{ foo = }" # preserves whitespace
   " foo = 'bar'"
   >>> line = "The mill's closed"
   >>> f"{line = }"
   'line = "The mill\'s closed"'
   >>> f"{line = :20}"
   "line = The mill's closed   "
   >>> f"{line = !r:20}"
   'line = "The mill\'s closed" '

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

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

バージョン 3.12 で変更: Prior to Python 3.12, reuse of the same
quoting type of the outer f-string inside a replacement field was not
possible.

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

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

バージョン 3.12 で変更: Prior to Python 3.12, backslashes were not
permitted inside an f-string replacement field.

フォーマット済み文字列リテラルは、たとえ式を含んでいなかったとしても、
docstring としては使えません。

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

フォーマット済み文字列リテラルを Python に追加した提案 **PEP 498** も
参照してください。また関連する文字列フォーマットの仕組みを使っている
"str.format()" も参照してください。


2.4.4. 数値リテラル
-------------------

There are three types of numeric literals: integers, floating-point
numbers, and imaginary numbers.  There are no complex literals
(complex numbers can be formed by adding a real number and an
imaginary number).

数値リテラルには符号が含まれていないことに注意してください; "-1" のよ
うな句は、実際には単項演算子 (unary operator) '"-"' とリテラル "1" を
組み合わせたものです。


2.4.5. 整数リテラル
-------------------

整数リテラルは以下の字句定義で記述されます:

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

値がメモリ上に収まるかどうかという問題を除けば、整数リテラルには長さの
制限がありません。

アンダースコアはリテラルの値を判断するにあたって無視されます。そのため
アンダースコアを使って数字をグループ化することで読みやすくできます。ア
ンダースコアは数字と数字の間に 1 つだけ、あるいは "0x" のような基数指
定の直後に 1 つだけ挿入できます。

なお、非 0 の十進数の先頭には 0 を付けられません。これは、Python がバ
ージョン 3.0 以前に使っていた C 形式の八進リテラルとの曖昧さを回避する
ためです。

整数リテラルの例をいくつか示します:

   7     2147483647                        0o177    0b100110111
   3     79228162514264337593543950336     0o377    0xdeadbeef
         100_000_000_000                   0b_1110_0101

バージョン 3.6 で変更: グループ化を目的としたリテラル中のアンダースコ
アが許されるようになりました。


2.4.6. Floating-point literals
------------------------------

Floating-point literals are described by the following lexical
definitions:

   floatnumber   ::= pointfloat | exponentfloat
   pointfloat    ::= [digitpart] fraction | digitpart "."
   exponentfloat ::= (digitpart | pointfloat) exponent
   digitpart     ::= digit (["_"] digit)*
   fraction      ::= "." digitpart
   exponent      ::= ("e" | "E") ["+" | "-"] digitpart

Note that the integer and exponent parts are always interpreted using
radix 10. For example, "077e010" is legal, and denotes the same number
as "77e10". The allowed range of floating-point literals is
implementation-dependent.  As in integer literals, underscores are
supported for digit grouping.

Some examples of floating-point literals:

   3.14    10.    .001    1e100    3.14e-10    0e0    3.14_15_93

バージョン 3.6 で変更: グループ化を目的としたリテラル中のアンダースコ
アが許されるようになりました。


2.4.7. 虚数 (imaginary) リテラル
--------------------------------

虚数リテラルは以下のような字句定義で記述されます:

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

An imaginary literal yields a complex number with a real part of 0.0.
Complex numbers are represented as a pair of floating-point numbers
and have the same restrictions on their range.  To create a complex
number with a nonzero real part, add a floating-point number to it,
e.g., "(3+4j)".  Some examples of imaginary literals:

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


2.5. 演算子
===========

以下のトークンは演算子です:

   +       -       *       **      /       //      %      @
   <<      >>      &       |       ^       ~       :=
   <       >       <=      >=      ==      !=


2.6. デリミタ (delimiter)
=========================

以下のトークンは文法上のデリミタとして働きます:

   (       )       [       ]       {       }
   ,       :       !       .       ;       @       =
   ->      +=      -=      *=      /=      //=     %=
   @=      &=      |=      ^=      >>=     <<=     **=

ピリオドは浮動小数点数や虚数リテラル中にも置けます。ピリオド三つの列は
スライス表記における省略符号 (ellipsis) リテラルとして特別な意味を持ち
ます。リスト後半の累算代入演算子 (augmented assignment operator) は、
字句的にはデリミタとして振舞いますが、演算も行います。

以下の印字可能 ASCII 文字は、他のトークンの一部として特殊な意味を持っ
ていたり、字句解析器にとって重要な意味を持っています:

   '       "       #       \

以下の印字可能 ASCII 文字は、Python では使われていません。これらの文字
が文字列リテラルやコメントの外にある場合、無条件にエラーとなります:

   $       ?       `

-[ 脚注 ]-

[1] https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt
