このBlogは移転しました。今後は aish.dev を御覧ください。

Python 3.6の概要 (その1 - f文字列)

f文字列

これまで、Pythonで文字列に変数を埋め込む方式にはいくつかあったが、ついに式を文字列中に直接記述できるようになった。 (PEP 498 -- Literal String Interpolation)

式を埋め込んだ文字列はf文字列(formatted string:フォーマット済み文字列)と呼ばれ、raw文字列の r と同じように、先頭に f を指定する

f文字列は通常の文字列と同じようも使えるが、文字列内の {} で囲まれた部分は、Pythonの式として評価し、その結果を文字列として出力する。

>>> f'hello'   # 式を含まないf文字列
'hello'

>>> f'100+1={100+1}'  # 式を評価
'100+1=101'

>>> order={'spam':100, 'ham':200}
>>> f'spam: {order["spam"]}, ham: {order["ham"]}' # 変数を参照
'spam: 100, ham: 200'

>>> f'Hello, {input("名前を入力してください: ")}' # 関数の呼び出し
名前を入力してください: いしもと
'Hello, いしもと'

文字列のformatメソッドと同じように、出力フォーマットも指定できる。

>>> f'{100:0>20f}'
'0000000000100.000000'

f文字列内の式は、Pythonコンパイル時に抽出され、実行時に値を評価して結果をフォーマットしている。式の評価は、文字列の左から順に行われる。

>>> import dis, sys
>>> def f(a, b):
...     return f'A: {a}, B: {b!a:10s}'
...
>>> dis.dis(f)
  2           0 LOAD_CONST               1 ('A: ')
              2 LOAD_FAST                0 (a)
              4 FORMAT_VALUE             0
              6 LOAD_CONST               2 (', B: ')
              8 LOAD_FAST                1 (b)
             10 LOAD_CONST               3 ('10s')
             12 FORMAT_VALUE             7 (ascii, with format)
             14 BUILD_STRING             4
             16 RETURN_VALUE

f文字列内の式は、通常の式と変わりなく評価してスタックに積まれ、FORMAT_VALUEというバイトコードで文字列に変換される。最後にBUILD_STINRGで、文字列を結合する、という仕組みのようだ。現行の文字列フォーマットと比べても、とくにオーバーヘッドが大きい、ということもなさそうだ。