Python 3.6で導入されたフォーマット済み文字列リテラル(f-string)がシンプルな記述へ[3.12]
Python 3.12では、f-stringと呼ばれるフォーマット済み文字列リテラルがさらに使いやすくなりました。ここでは、Python 3.6で導入されたフォーマット済み文字列リテラルを、その強化の過程を追いながら紹介します。
フォーマット済み文字列リテラル(f-string)とは
フォーマット済み文字列リテラル(以下、f-string)とは、文字列リテラルに接頭辞「f」を付けることによって、文字列の一部を変数や式で置き換えることができるようにする機能です。JavaScriptなどのプログラミング言語で利用可能なおなじみの機能ですが、もともとは文字列に対するformatメソッドで実現していました。以下のように使用します。
"{インデックス:書式指定子}".format(値[, ...])
{ ... }は置換フィールドと呼ばれ、値による置き換えの対象となります。インデックスは値との対応を決める0からの数値あるいはキーワードで、書式指定子は値の型を決める文字の組み合わせです。インデックスは省略でき、その場合はformatメソッドの引数が順番に使われます。書式指定子も省略可能で、その場合は引数の値から最適なものが選択されます。
name = "Nao"
birth = 1900
print("{name} さんの誕生年は {birth} 年です。".format(name=name, birth=birth))
# 実行結果:Nao さんの誕生年は 1900 年です。
formatメソッドによる方法は、置換フィールドと値が分離しているので対応の管理が面倒、同じような記述が重複するといった問題がありました。そこでPython 3.6において、文字列中に置換フィールドと値を直接埋め込み可能なf-stringが導入されました。f-stringでは、接頭辞「f」を付加した文字列リテラルにおいて置換フィールドに値と書式を直接書けるので、シンプルな記述が可能になりました。
print(f"{name} さんの誕生年は {birth} 年です。")
# 実行結果:Nao さんの誕生年は 1900 年です。
Python 3.12で強化されたf-string
Python 3.12では、このf-string構文がさらに使いやすく強化されました。具体的には、以下の点で強化されています。
- 同一引用符の利用が可能に
- 式やコメントを複数行に分けて記述可能に
- バックスラッシュを記述可能に
通常、文字列リテラルでは外側と内側で同じ種類の引用符を使うことはできません。例えば、外側が二重引用符(")であれば、内部で使えるのは単引用符(')かトリプルクォート("""または''')のみです。これがPython 3.12のf-stringにおいては緩和され、同一引用符の使用が可能になりました。これにより、例えば以下のリストのような記述が可能になります。
names = ['Nao', 'Shino', 'Yuutan']
print(f"グループメンバー一覧:{", ".join(names)}")
# 実行結果:グループメンバー一覧:Nao, Shino, Yuutan
置換フィールド内に文字列リテラルとjoinメソッドを入れていますが、ここで文字列リテラルに外側と同じ二重引用符を使うことができます。文字列リテラルの中だからと、別の引用符を使う必要がなくなりました。これは、単引用符、トリプルクォートでも同じです。極端な例を挙げれば、以下のような記述も可能です。f-stringにおいては入れ子も可能でしたが、Python 3.11までは引用符が重複しないように最初の例のようにトリプルクォートまで駆使する必要がありました。
print(f"""{f'''{f'{f"{name}"}'}'''}""") // ~Python 3.11
print(f"{f"{f"{f"{f"{f"{name}"}"}"}"}"}") // Python 3.12~
# 実行結果:Nao
さらに、置換フィールドを複数行に分けて記述したり、バックスラッシュによるエスケープ文字をUnicodeも含めて記述可能になりました。
print(f"グループメンバー一覧:{"\N{black spade suit}".join([
'Nao',
'Shino',
'Yuutan'
])}")
# 実行結果:グループメンバー一覧:Nao♠Shino♠Yuutan
