世界を動かす技術を、日本語で。

Fstrings.wtfは、Fストリングスに関するウェブサイトです。

2025年7月19日原文(fstrings.wtf)

概要

  • Python 3.13の f-string 動作に関するクイズの紹介
  • 問題が発生した場合は チケット作成 を推奨
  • 回答方法として 数字キーや矢印キー の利用案内
  • クイズの 作成者は@mitsuhiko、Claudeとの共同制作
  • ソースコードはGitHub で公開

Python 3.13のf-string挙動クイズ概要

  • Python 3.13で導入・変更された f-stringの挙動 に関するクイズ
  • 問題やバグを発見した場合は チケット作成 による報告を推奨
  • 回答方法として、 1/2/3/4の数字キー で素早く選択可能
  • 矢印キー で選択肢を移動し、 スペースまたはEnterキー で決定可能
  • クイズの 作者は@mitsuhiko、Claudeとの共同作成
  • ソースコード はGitHubで公開されているため、自由に閲覧・利用可能

Hackerたちの意見

文字列補間って、推論みたいな機能の一つだよね。以前に使ったことがあると、使わないのがすごくイライラするし、ちょっと追加すると心地よくなる。でも、もっと追加すると、どんどん改善されていく気がするんだけど、ある日気づくと、全く意味不明なものを見ていて「やばい、何をやってしまったんだ?」ってなる。これは珍しいことで、普通はコンピュータサイエンスではできるだけ多くのものを持ちたいと思うけど、数学的にはそれは文字通りか実際的に不可能だって言われる。でもここでは、どちらもひどくて許可されるべきじゃない。PythonやC#が選んだ一つの選択肢は、まあ、好みに任せるってこと。コメントなしの補間文字列で16ページの重層式を作っても動くけど、同僚たちは君の名前を呪って、君の破滅を企てるだろう。そういうことを強制すると、コードレビューで落ちることになるかもね。もう一つの選択肢は、例えば標準C++ 23では、最初の一歩すら拒否すること。リッチなフォーマットはできるけど、標準C++では補間は全く提供されない。6つのパラメータをフォーマットしたいなら、パラメータとして渡すしかない。Rustの「ほんの少しの補間」には満足してる。識別子だけ補間できるから、他の式はダメだけど、でもそれでも多くの人には物足りないかもしれないし、もちろん場合によってはそれじゃ足りないこともある。

純粋さと実用性は相反するもので、どの言語もそのバランスを見つけるのが難しいんだよね。正しいバランスは一つじゃないから、忙しい頭を持った人たちは、自分の意見を正しいバランスとして受け入れてほしいって思うのは避けられないよ。

CSはできるだけ多くのものを持ちたいけど、数学がそれを許さないんだよね。これがどのトピックと関係あるの?

Rustの解決策が嫌いなのは、全然解決策じゃないから。補間は限られたケースでしか機能しないから、常に今の状況で使えるかどうか考えなきゃいけないし、コードをリファクタリングする時に無限に手間がかかる。最低でも、フィールドアクセスで使えるようにするべきだと思う。一方、Pythonではこういうサイトの例があって面白い/変わってるけど、実際には誰も気にしてないし、みんなf-stringを楽しんでるよ。

文字列補間はその機能の一つで、これらの「WTF」の70%は文字列補間についてじゃなくて、ただPythonのstring.formatの構文についてだよ。 https://docs.python.org/3/library/string.html#format-string-...

これがJavaScriptの構文だったら、ほとんどのコメントは直感的じゃない構文や変な機能を嘆いてるだろうね。

そうだね、クイズが言いたい本当のポイントは、PythonもJavaScriptと同じくらい足元をすくうようなところがあるってことだと思ったよ。JSについてはこういうのを何度も見たからね。賛成とは言わないけど、ここでの主な議論になると思ってたんだよね…

でも、これがPerlだったら、みんな祝ってるだろうね。

すごい、何年もPythonに触れなくてよかったって思う。善意で地獄が舗装されてるって感じかな。たぶん、Justineはhttps://justine.lol/lex/を更新すべきだね。

何年もPythonに触れなくてよかったって思う。そんなこと言わないで、どの言語にも癖はあるよ。

これらの多くは望ましい機能だよね!

これがf-stringsの最初の特別な機能だよ:末尾にイコールサインを追加すると、式とその評価結果を表示できる。 >>> foo='bar'; print(f"{foo=}") foo='bar' へぇ、そんなことができるなんて知らなかった。

Hacker Newsで議論の続きを見る