プログラミング
Pythonの文字列リテラルはちょっと面白い
Python string literals are kinda funny (sebsite.pw)
要約
この記事では、Pythonのraw文字列リテラル(r'...')とf文字列の興味深い挙動について解説しています。raw文字列はバックスラッシュで終われないというlexingの制約があり、一方f文字列は埋め込まれた式を解析するために完全なPythonパーサーを必要とし、コメントや複数行の式など複雑な構文を許容することが説明されています。
全文翻訳
python string literals are kinda funny
2026-08-06
簡単なクイズです。次のうち、有効なPythonのコードはどちらで、結果として得られる文字列の内容は何でしょうか?
r'asdf\'
r'asdf
答えは、最初の行は構文エラーです。2番目の行は有効です。結果として得られる文字列の内容は asdf\ です。
'r' プレフィックスは、それをraw文字列リテラルにします。そのため、バックスラッシュのエスケープは特別な方法で解釈されません。しかし、raw文字列リテラルは通常の文字列リテラルと同じようにlexingされるため、バックスラッシュで終わることはできません。これは、次の引用符が文字列の終わりとして扱われないためですが、引用符は実際には「エスケープ」されていません。
これは間違いなく、実装を単純化するために最初に行われたものであり、これから示すことをさらに面白くしています。
ブログ記事の続きです。
これは有効なf文字列です:
>>> f'{'}'}'
'}'
もう一つあります:
>>> f'{67#}'
...
'}'
'67'
f文字列のlexingは、波括弧内の式の完全なPythonパーサーの呼び出しを必要とします。この式には引用符を含めることができ、複数行に分割することも、コメントを含めることさえできます!式は、括弧で囲まれておらずコメントもない }、!、または : によってのみ終了します。(式が : で終了できるという事実は、ラムダ式と代入式をf文字列内で括弧で囲む必要があることを意味します。これは、私が思うにちょっと面白いです。)
f'{lambda: 67}' # 構文エラー
f'{x := 67}' # f'{x}' と実質的に同じ