デバッグ中に変数の「名前」と「中身」を素早く確認できると原因調査がぐっと楽になります。
Python 3.8以降では、f-stringのデバッグ表記を使うと変数名=値の形で自動出力が可能です。
本記事では、f'{var=}'
の基本から、見やすく整える書式指定、注意点やベストプラクティスまで、初心者の方にもわかりやすく丁寧に解説します。
f-stringの基礎とf'{var=}’とは?
f-stringは文字列の中で{式}
の形で値を埋め込める機能です。
Python 3.8で追加されたf'{expr=}'
という書き方を使うと、式そのものと、その評価結果を「expr=value」の形で一緒に表示できます。
Python 3.8+の「変数名=値」自動表示
デバッグ用の短記法として、例えばf'{x=}'
はx=10
のように自動で「x=」を付けて表示します。
デフォルトではrepr表現(!r
)が使われるため、文字列なら引用符付きで表示され、構造がわかりやすくなります。
# Python 3.8+ で動作します
x = 10
s = "hello"
print(f'{x=}')
print(f'{s=}') # repr相当なので、文字列はクォート付きで出ます
x=10
s='hello'
printデバッグを短く書ける理由
通常、変数名と値を両方出したい時はprint('x=', x)
などと2つ以上の引数を書きますが、f'{x=}'
を使えば1箇所にまとめて可読性を保てるうえ、式やインデックスもそのまま書けるのが大きな利点です。
基本の使い方(初心者向け)
まずは「変数1つ」「複数」「式や属性・インデックス」の3パターンを順に確認します。
変数1つを表示する
最も基本的な書き方はf'{変数名=}'
です。
デフォルトはreprなので文字列にはクォートが付きます。
# 変数1つをデバッグ出力
age = 24
name = "Alice"
print(f'{age=}')
print(f'{name=}')
age=24
name='Alice'
複数の変数をまとめて表示する
カンマ区切りで並べるだけです。
スペースの有無もそのまま出力に反映されます。
# 複数の変数をまとめて
a, b, c = 1, 2, 3
user = "bob"
print(f'{a=}, {b=}, {c=}, {user=}')
print(f'{a=}, {b = }, {user = }') # = の前後にスペースを入れると、そのまま出力されます
a=1, b=2, c=3, user='bob'
a=1, b = 2, user = 'bob'
式や属性・インデックスも表示できる
変数だけでなく任意の式や属性、インデックスアクセスも書けます。
表示される左側は「式そのもの」なので、何を評価したのかが明確です。
# 式、属性、インデックスの表示例
nums = [2, 4, 8]
user = {"name": "Carol"}
class Box:
def __init__(self):
self.values = [10, 20, 30]
box = Box()
print(f'{nums[0]=}')
print(f'{sum(nums)/len(nums)=}')
print(f'{user["name"].upper()=}')
print(f'{box.values[1]=}')
nums[0]=2
sum(nums)/len(nums)=4.666666666666667
user["name"].upper()='CAROL'
box.values[1]=20
書式指定で見やすくする
長い小数や文字列、複数項目の見栄えは、書式指定
や!r
/!s
、sep
/end
の調整で整えられます。
小数点や桁数を整える(例: :.2f)
f'{expr=:書式}'
の形で、右辺の値に書式を適用できます。
書式がある場合はreprではなくフォーマット結果が使われます。
# 小数点以下2桁で丸める
import math
pi = math.pi
ratio = 7 / 3
print(f'{pi=:.2f}') # 2桁
print(f'{ratio=:>8.3f}') # 右寄せ・幅8・小数3桁
print(f'{1234567=:,}') # 3桁区切り
pi=3.14
ratio= 2.333
1234567=1,234,567
よく使う指定
:.2f
小数2桁:,
3桁区切り:>8
幅8で右寄せ:^10
幅10で中央寄せ
!rと!sの違い(表示方法の選択)
デフォルトは!rなので、文字列はクォート付きで表示されます。
!s
を付けると人間が読む用のstr表現になります。
# !r と !s の違い
text = "Hello\nworld"
print(f'{text!r=}') # repr: エスケープを含む表現
print(f'{text!s=}') # str: 実際に改行して表示
text!r='Hello\nworld'
text!s=Hello
world
以下の表は違いの要点です。
指定 | 使う関数 | 特徴 |
---|---|---|
なし | デフォルトは!r (var=のとき) | デバッグ向け。文字列はクォート付きでわかりやすい |
!r | repr() | デバッグ向けの厳密な表現 |
!s | str() | 人が読む用途に向く自然な表現 |
!a | ascii() | 非ASCII文字をエスケープした表現 |
長い文字列を短く出す(スライスで制限)
単純にスライス
を使えばOKです。
式の左側にそのまま切り取り内容が残るので、どこまで表示したか一目でわかります。
# 長い文字列の先頭30文字だけを表示
long_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " * 3
print(f'{long_text[:30]=}')
print(f'{long_text[:30]!s=}') # !s にするとクォートなしで出る
long_text[:30]='Lorem ipsum dolor sit amet, c'
long_text[:30]=Lorem ipsum dolor sit amet, c
改行や区切りを整える(printのsepやend)
複数項目を並べるときは、print
のsep
とend
を活用すると行を整えやすくなります。
# sep と end でレイアウトを整える
x, y, z = 10, 20, 30
print(f'{x=}', f'{y=}', f'{z=}', sep=' | ', end=' <- 行末をカスタム\n')
# ログ風に時刻と値を1行で
from datetime import datetime
now = datetime(2025, 1, 23, 12, 34, 56)
print(f'{now:%Y-%m-%d %H:%M:%S}', f'{x=}', f'{y=}', sep=' ')
x=10 | y=20 | z=30 <- 行末をカスタム
2025-01-23 12:34:56 x=10 y=20
注意点とベストプラクティス
安全に、そして効率的に使うためのポイントをまとめます。
Pythonバージョン要件(Python 3.8+)
f'{expr=}'
構文はPython 3.8以降でのみ利用可能です。
古い環境ではSyntaxErrorになります。
バージョン確認はpython --version
、もしくは実行時にsys.version
で確認してください。
# バージョン確認の一例
import sys
print(f'{sys.version=}')
sys.version='3.12.4 (main, Jun 7 2024, 00:00:00) [Clang 15.0.0]'
機密情報は出力しない(デバッグ時の注意)
APIキー、アクセストークン、パスワード、個人情報などの機密は、f-stringで標準出力やログに出さないようにしてください。
出力先がコンソールやCIログであっても漏洩リスクがあります。
必要なときはマスク処理やダミー値に置き換えましょう。
本番はlogging、学習や検証はprintでOK
開発初期や学習時はprint(f'{var=}')
で十分ですが、本番運用ではlogging
モジュールの利用を推奨します。
レベル制御や出力先の切り替え、構造化出力などが行えます。
f-stringはlogging.debug(f'{x=}, {y=}')
のように併用しても構いませんが、多量出力は性能に影響するため注意してください。
# logging と併用する例
import logging
logging.basicConfig(level=logging.INFO)
items = ["A", "B", "C"]
logging.info(f'{len(items)=}')
INFO:root:len(items)=3
空白もそのまま表示される点に注意
f'{x = }'
のように= の前後に入れたスペースは、そのまま出力に現れます。
ログを機械処理する場合は、余計な空白を入れないことをおすすめします。
x = 42
print(f'{x=}')
print(f'{x = }') # = の前後にスペース
x=42
x = 42
まとめ
f-stringのf'{expr=}'
は、式と値を「式=値」で簡潔に出力できる強力なデバッグ機能です。
デフォルトでrepr
を使うため構造がわかりやすく、書式指定や!r
/!s
、sep
/end
と組み合わせれば、見やすさと作業効率が大幅に向上します。
一方で、機密情報の出力は厳禁、空白はそのまま出る、Python 3.8+が必須といった注意点もあります。
学習や検証では積極的に活用しつつ、本番ではlogging
への移行を意識して、読みやすく安全なデバッグ出力を心がけてください。