実際によく使うフォーマット
現代のPythonコードで文字列に値を埋め込むときの定番が、このf-string(フォーマット済み文字列リテラル)です。クォートの前に f を付けるだけで、{...} の中に書いた式がその場で評価されます。
ポイントは3つ。まず、先頭の f を付けることで、文字列リテラル全体がテンプレートとして扱われるようになります。次に、{} は値を差し込むための場所。そして、その中に書いた式は、文字列を書いた瞬間ではなく print が実行される瞬間に評価されます。
実務では、他のどのフォーマット方法よりも f-string を使う場面が圧倒的に多くなります。"Hello, " + name + "." より短く、"Hello, %s." % name よりわかりやすく、.format() より柔軟。まさに python 文字列フォーマットの定番です。
{} の中には「評価できるもの」なら何でも書ける
{} に入れられるのは変数名だけではありません。Python の式ならどんなものでもOKです:
メソッド呼び出し、インデックス、四則演算、条件式 — どれも使えます。ルールはひとつだけ。波カッコの中はできるだけ短くすること。プレースホルダーの中に3行がかりの計算を書くくらいなら、いったん名前付きの変数に入れてから、その名前だけを埋め込みましょう。
数値をフォーマットする
式のうしろにコロン(:)を置くと、そこから フォーマット指定(format spec) が始まります。これは値の表示方法を細かく制御するためのミニ言語です。
各書式指定子の意味をサクッとまとめておきます。
.2f— 浮動小数点数を小数点以下2桁で表示。表示用に四捨五入されます。,— 3桁区切りのカンマ。intでもfloatでも使えます。.1%— 100倍して%を付ける書式。比率やパーセンテージに便利。.2e— 小数点以下2桁の指数表記。
これらは組み合わせて使えます。たとえば f"{total:,.2f}" なら "1,234.57" のように出力されます。
桁揃え・幅指定・ゼロ埋め
列をきれいに揃えて出力したいときは、次のように書きます。
<10 は「左寄せで、最低10文字分になるようにパディングする」という意味です。>5 なら「右寄せで5文字分に揃える」、^ を使えば中央寄せになります。
スペース以外の文字で埋めたいときは、寄せ方を指定するフラグの前に埋め文字を書けばOKです。
日付のフォーマット
datetime オブジェクトにも、同じ {値:書式指定} の構文がそのまま使えます。
コロン以降に書く指定は strftime のフォーマット文字列です。strftime で使える % コードはすべてそのまま使えます。詳しい内容は datetime のページで解説します。
デバッグに便利な = の小技
f-string の地味に便利な機能のひとつがこれです。式のあとに = を付けると、Python が式のソースコードと評価結果の両方を出力してくれます。
出力は count=7、price=19.99、count * price=139.93 のようになります。print("count =", count) と書いていたものが、たった3文字で済むわけです。デバッグ中に変数の中身をちょっと確認したいときに、覚えておくと便利なテクニックです。
波括弧をエスケープする
出力にリテラルの { や } をそのまま入れたいときは、二重にして書きます。
シングルの波かっこ { は式の開始を表すので、出力にそのまま { や } を含めたいときは {{ と }} のようにエスケープします。
複数行の f-string
f-string はトリプルクォートとも相性がよく、コード中に小さなテンプレートを書きたいときに便利です。
長い f-string は、隣り合う文字列リテラルに分割して書くこともできます。Python が自動で連結してくれるので、以下のように書けます。
昔ながらの書き方を目にすることもある
既存のコードを読んでいると、古いフォーマットの書き方に出くわすことがあります。主に次の2種類です。
出力結果はどれも同じになります。読みやすさで選ぶなら、10回中9回は f-string の勝ちです。テンプレートを一度作って何度も使い回したい場面では .format() が便利ですし、% は既に % を使っている古いコードをメンテするときだけで十分です。
f-string が向かないケース
f-string を避けたほうがいい場面が 2 つあります。
SQL クエリの組み立て。 ユーザー入力を f-string で SQL 文字列に埋め込むのは絶対にやめましょう。必ずデータベースライブラリのパラメータ化クエリを使ってください。ここで f-string を使うと、まさに SQL インジェクションの温床になります。
多言語対応の UI テキスト。 アプリが複数言語に対応している場合、外部の翻訳ツールが拾えるテンプレート形式を使う必要があります。一般的には gettext の _(...) か、フレームワーク固有のヘルパーです。f-string は文章の構造をソースコードに直接焼き込んでしまうため、翻訳作業が一気にやりにくくなります。
それ以外の用途 —— ログ出力、コンソール表示、URL の組み立て、設定文字列の生成、表示用の数値フォーマットなど —— では、f-string が最適解です。
次回:数値と真偽値
f-string は数値のフォーマットで特に活躍するので、数値型についてもう少し踏み込んで理解しておくと役立ちます。次の章で見ていきましょう。
よくある質問
Pythonのf-stringとは何ですか?
f-stringは、先頭にfを付けた文字列リテラルのことです。{...}の中に書いた式が実行時に評価され、その値が文字列に埋め込まれます。たとえばf"Hello, {name}"と書けば、nameの中身がそのまま文字列に差し込まれます。
f-stringはいつから使えるようになりましたか?
Python 3.6から導入されました。現行のPython 3ならどのバージョンでも使えるので、今新しくコードを書くなら基本はf-stringでOKです。古い%記法や.format()も動きはしますが、多くのケースでf-stringの方が読みやすく書けます。
数値を小数点以下2桁でフォーマットするには?
波括弧の中でコロンの後にフォーマット指定を書きます。f"{price:.2f}"と書けばOKです。.2fは「小数点以下2桁の浮動小数点数」という意味で、表示用に丸められるだけで元の変数の値は変わりません。
f-stringの中にはどんな式を書けますか?
四則演算、メソッド呼び出し、関数呼び出し、三項演算子など、式ならだいたい何でも書けます。f"{name.upper()}"やf"{price * 1.2:.2f}"も問題なく動作します。ただし中の式が複雑になってきたら、いったん変数に代入してから埋め込んだ方が読みやすいコードになります。