メインコンテンツへスキップ

Pythonの新機能t-stringsがキター!SQLもHTMLも楽々記述で開発効率爆上がり!?

·3 分
2025/04 Python T-Strings SQL HTML プログラミング

Pythonの新機能t-stringsがキター!SQLもHTMLも楽々記述で開発効率爆上がり!?

引用元:https://news.ycombinator.com/item?id=43748512

serbuvlad 2025-04-21T09:51:02

これ結構イケてるじゃん。db.execute(”QUERY WHERE name = ?”, (name,))db.execute(t”QUERY WHERE name = {name}”)になるってことだよね。
このシンタックスシュガーは、言語の複雑さを増す以上の価値があると思うな。ライブラリ開発者が{}の展開を自由にできるのは良いことだし、言語全体でテンプレート構文が統一されるのも良いことだと思うよ。

rwmj 2025-04-21T11:03:27

20年くらい前にこれの安全なOCaml実装をしたよ。最新バージョンはこれ:https://github.com/darioteixeira/pgocaml
変数はコンパイル時に安全に補完されるんだ。型チェックもされてて、コンパイル時にカラム型とデータベースをチェックしてる。

tasuki 2025-04-21T11:39:30

あんたのやったことはPythonのやつよりすごいし、20年も前なんだね。お見事。でも現実は2025年、Pythonの人気は止まらないし、OCamlなんて誰も気にしちゃいない(Pythonより良い言語はたくさんあるのに)。悲しいね。

skeledrew 2025-04-21T18:39:53

多数派が「より良い」言語を使わないってのが面白いよね。多数派の判断ってそんなに間違ってるのかな?それとも「より良い」ってのは、時間の経過とともに普及率で決まるのかな?

daedrdev 2025-04-21T19:16:33

みんな自分の最適化したい指標が違うだけだよ。Pythonは学びやすいから良いんだと思う。

zahlman 2025-04-21T21:28:48

最近のLinuxならコマンドプロンプトでpythonって打てばREPLが起動するし、Windowsなら公式サイトからインストーラーをダウンロードしてpyって打てばいい。
Pythonを教えるのにimportなんて必要ないし、標準ライブラリだけでも色々できる。venvは依存関係が競合するプロジェクトが出てきてからで良いんだよ。Pythonは教えやすいし、実用的だから先生も教えるんだよ。boilerplateも少ないしね。

benwilber0 2025-04-21T14:06:15

サーバーサイドのパラメータバインディングの利点は、SQLインジェクション対策だけじゃないよね?PGの拡張プロトコル(バイナリ)を使ったり、パラメータ化されたプリペアドステートメントをキャッシュしたりとか。
あとdb.execute(t”QUERY WHERE name = {name}”)ってdb.execute(f”QUERY WHERE name = {name}”)とほぼ同じじゃん。一文字違うだけでインジェクションされやすくなる。
この新しいフォーマット指定子はSQLクエリには向いてないと思う。

masklinn 2025-04-21T14:21:25

>Aren’t there other benefits to server-side parameter binding besides just SQL-injection safety? For instance, using PG’s extended protocol (binary) instead of just raw SQL strings. Caching parameterized prepared statements, etc.
>テンプレート文字列の上で実装できるよ。
>A single character difference and now you’ve just made yourself trivially injectible.
>違う型だからdb.executeで静的にも動的にも拒否できるよ。
>I don’t think
>その通り。
>this new format specifier is in any way applicable to SQL queries.
>PEP 750のモチベーションの一つだよ。

MR4D 2025-04-21T17:50:27

もう一回コメント読んでみてよ。「f」とか「t」に気づくかどうか、の話だってば。見た目めっちゃ似てるじゃん。

rocha 2025-04-21T18:00:16

いやいや、エラーになるって。だって、stringとtemplateは型が違うし、インターフェースも違うもん。

Izkata 2025-04-21T19:48:21

parentを何回かクリックして、このスレッドの最初のコード例を見てよ。ユーザーが意図的にstring(f-stringを含む)とt-stringを使ったかどうか区別できないような使い方してるんだよ。

tetha 2025-04-21T11:36:44

ライブラリで使うなら、こんな感じかな。
sh(t”stat {some_file}”)

t-stringを使えば、some_fileの中身をエスケープしてからshellに渡せる。stat “$( base64 -d [base64 encoded content of some_file] )”みたいにすれば、セキュリティも上げられるかもね。

mikeholler 2025-04-21T14:01:07

気になるところは、オーバーライドしようとしてるパターンと見た目が似すぎてることかな。
db.execute(f”QUERY WHERE name = {name}”)


db.execute(t”QUERY WHERE name = {name}”)

fzzzy 2025-04-21T14:11:46

でも、f stringの方はnameパラメータがないからエラーにならない?

ds_ 2025-04-21T10:26:10

execute関数がt-stringだと認識して、nameがユーザー入力から来てたらSQL injectionを防げるってこと。f-stringはすぐにstringに評価されるけど、t-stringはtemplateオブジェクトに評価されて、stringにするには追加の処理が必要。

Tenoke 2025-04-21T10:30:42

それなら、便利なのはexecute関数を自分で書く必要があるってことだね(コメントにあるみたいにただの置き換えじゃない)。追加の関数があれば、f-stringに入れる値の安全性を確認できる。
db.execute(f”QUERY WHERE name = {safe(name)}”)みたいにする方が良い気がする。

ubercore 2025-04-21T10:36:40

この例の問題点は、safeをどこから持ってくるかってことだよね?テンプレートをdb.executeに渡せば、dbインスタンスが接続先のバックエンドに合わせて安全性を処理してくれるじゃん。そうでなければ、文字列を適切にサニタイズするために、db接続を使ってsafe関数を作る必要があるし。さらに、safeがただの文字列を返すだけだと、db.executeがパラメータを別の方法で渡す能力も失われちゃうんだよね。変数が文字列に埋め込まれてるって情報がなくなっちゃう。

Tenoke 2025-04-21T10:50:33

db.safeは、t-stringのために作る安全性チェック付きの新しいdb.executeと同じだね。でも、値をさらに使ったり、もっと複雑なケースではメリットもあると思うよ(今のところ自分のコードではファンじゃないけど)。

ubercore 2025-04-21T10:59:53

せやけど、db.safe(”SELECT * FROM table WHERE id = {}”, row_id)みたいになるんちゃう?db.execute(t”SELECT * FROM table WHERE id = {row_id}”)の代わりに。個人的には後者の方がええな。

Tenoke 2025-04-21T11:07:44

いやいや、db.execute(f”QUERY WHERE name = {db.safe(name)}”)でしょ。
db.executeで暗黙的に安全性を確保するんじゃなくて、db.safeの中で明示的に安全性を追加するんだよ。もし気が向いたら、namedb.safeの中でdb.foosに代入して、後で(executeの中でも)使えるようにすることもできる。

もっとコメントを表示(1)
ZiiS 2025-04-21T11:41:01

でも、もし誰かがsafeを省略したら、動くかもしれないけど、インジェクションを許しちゃうかも。

thunky 2025-04-21T12:52:56

誰かがt”を使うのを忘れて、代わりにf”を使った場合も同じことが言えるよね。少なくともdb.safeは何をするか言ってるけど、t”は違う。

burky 2025-04-21T10:26:26

f-stringsは値をサニタイズしないから、安全じゃないよ。この記事に書いてある。

Tenoke 2025-04-21T10:52:14

記事には書いてあったけど、ここの例ではそれが当然のこととして扱ってるよね。

sanderjd 2025-04-21T12:35:27

“they”ってどういう意味?テンプレート補完関数のこと?
そう、言語にこれがあることで、ライブラリの作者は、それが適切なユースケースのために実装を書くっていう考えだよ。

Tenoke 2025-04-21T13:47:34

サニタイズのことだよ。昔のdb.executet-stringを使ったからって、以前より安全になったって意味にはならないよ。

masklinn 2025-04-21T14:24:34

もしt-stringがdb.executeで使われてて、それがt-stringに対応してないならエラーになるよ。でも、もしdb-executeが対応してたら、外部パラメーターを使うのと同じくらい安全なはず。で、もしt-stringじゃないものが使われたら、最終的には拒否されるべきだね。

Tenoke 2025-04-21T14:35:16

t-stringを受け入れる関数だからって、デフォルトでサニタイズ処理が行われてるわけじゃないからね。

tikhonj 2025-04-21T14:49:50

関数がtemplateを受け入れるなら(stringとは違う種類のオブジェクト)、サニタイズしてるか、明示的にサニタイズなしでtemplateを実装してるかのどっちかだよー。うっかりやっちゃうのは難しいと思うな!
重要なのは、t-stringはstringじゃなくて、stringの構文を再利用してTemplateオブジェクトを作る新しいリテラルってこと。これがf-stringと根本的に違う点だね。新しい型だから、stringを受け入れるライブラリは明示的に処理するか、TypeErrorを出す必要があるんだ。

Tenoke 2025-04-21T16:09:23

なんでサニタイズなしで使うのが難しいと思うのかわかんないなー。値のチェックは必須じゃないし、単に便利に使ってるだけかもよ。
t-stringを実装して、値を保存したり、ログを改善したりするために使ってて、チェックやエスケープのことなんて考えてないかもしれないし。他の場所で忘れがちなのと同じようにね。

NewEntryHN 2025-04-21T10:25:52

SQLで値じゃないもの(例えばカラム名)もフォーマットする必要があるとして、execute関数はどうやってフォーマットすべきものとパラメーター化された値を区別するのさ?

amelius 2025-04-21T10:29:48

フォーマット指定子のコンパイル時チェックがないのが残念だね。

amelius 2025-04-21T10:43:33

Pythonもコード実行前にいくつかチェックするよ。例えば:
print(”hello”)

def f():
nonlocal foo

とすると:
SyntaxError: no binding for nonlocal ‘foo’ found

って出るでしょ?helloの前にエラーが出て、f()すら呼ばれてない。

pinoy420 2025-04-21T10:17:54

これからは明示的に書かなくても、t-stringに慣れてない人が(ほとんどの人がそうだろうけど。f-stringとそのフォーマット機能を知ってる人すら少ないし)うっかりf-string使っちゃうだけで、大変なことになるかもね。

mcintyre1994 2025-04-21T10:36:33

まともなライブラリなら、テンプレートを期待してるところにstringを渡したらエラー出すでしょ。それに、そのライブラリは型も持ってるから、IDEが事前に教えてくれるはずだよ。

florbnit 2025-04-21T17:36:24

マジかー、t-stringsにそんな期待してるの?HTMLとかSQLに変換されるって、どうやって判断するんだろ?文字列の書き方から推測するしかないじゃん?それって場当たり的だし、t-stringsの機能とは関係なくね?今の設計だと、何のコンテンツになるか全然わかんないし。変換関数が全部処理するんでしょ?sqlselect * from {table}みたいなのがあれば良かったのにね。変換される前のSQLが正しいSQLである保証もないし。tgive me {table} but only {columns}が変換後にSQLになるかもしれないし。>元のコメント書いた人の意見に対する批判的な意見だね

davepeck 2025-04-21T18:55:08

えー、そう思う?最初は変に感じるかもね!Paulも言ってるけど、PEP 750を作る時、色々考えたんだよ。結局、PEPはツールが採用できる色々なアプローチを残してるし(他の人も言ってるけど)、ツールコミュニティが協力して解決すべき問題だから、PEPの範囲外にしたんだ。だから、エコシステムが適応してくれると嬉しいな!

spankalee 2025-04-21T18:35:59

html(t”

Hello

”)みたいなパターンが出てくると思うよ。ハイライターとか静的解析ツールは、これを見て判断するんじゃない?JavaScriptのtagged template literalsも同じくらい柔軟だし。tag関数を動的に選べるから。Pythonのツールも同じようにできると思う。名前付きの処理関数の中にあるt-stringsだけをサポートすればいいんじゃないかな。

dandellion 2025-04-21T21:33:47

型ヒントを使うのもありだよね。title: HTMLTemplate = t”

Hello

”みたいな。

pauleveritt 2025-04-21T17:55:02

元のPEPと議論では、それも検討してたんだ。でも、後で出てくるようにするために削除したんだ。言語にシグナルを送る方法は色々あるけど、ツールに優しいものもあれば、より堅牢なものもある。

もっとコメントを表示(2)
lolinder 2025-04-21T23:12:58

PyCharm(と他のJetBrains IDE)は、少なくとも10年前から、コメントを使ってPython文字列に言語を注入するのをサポートしてるよ[0]。最悪の場合でも、フォーマッターが自動フォーマットを適用するために使えるはずだよ。でも、それだけじゃない!IntelliJ for Javaは、引数にアノテーションをつけるのもサポートしてる[1]。そうすると、特定の関数で文字列リテラルを使う場所全部で、シンタックスハイライトが効くんだ。Pythonでは、typing.Annotatedがまさにこういう目的のために設計されたみたい[2]。だから、こんな感じにできるはず。SQL = Annotated[Template, “language”, “SQL”]

def query(sql_query: SQL):
# do stuff with Template to sanitize

query(t”SELECT * FROM foo WHERE bar={bar}”)

テンプレート文字列がこれを実現するために必要ってわけじゃないけどね!JetBrainsはずっと前からやってるし。でも、テンプレート文字列がこういう目的で十分に役立つなら、ツールが進化して、フォーマッターや他のエディターでサポートしてくれるかもしれない(PyCharmがJavaより良いサポートを受けられるかも)。

pauleveritt 2025-04-22T06:43:04

PEPの作者の一人です。JetBrainsにもいます。PyCharmチームと話してます。

acdha 2025-04-21T18:09:47

型アノテーションでできるんじゃない?例えば、SQLAlchemyがSQL型を持ってて、mypyみたいなツールがTemplateインスタンスを見て、安全に使ってるか確認できる。Black, Ruff, SQLFluffは、Annotated[Template, SQL]を探して、テンプレートをSQLとしてフォーマットできるって気づく。Djangoは、Annotated[Template, Email], Annotated[Template, HTML], Annotated[Template, JSX]を持ってて、同じテンプレート構文がどのコンテキストを対象にしてるかを示すこともできる。

pauleveritt 2025-04-21T18:18:40

これ、PEPの最初の改訂で議論したことなんだよね(Annotatedを使うってやつ)。でもね、リンターってPythonの型システムのこと全然知らないんだって。PyCon USとかEuroPythonとかで、この辺のコミュニティを盛り上げて、何とかしたいと思ってる。JSX/TSXの世界は本当にツールが充実してるから。それを欲しい人には提供できるし、場合によってはもっと良くできるかもね。

acdha 2025-04-21T19:13:30

へー、面白いね。背景情報ありがとう。Astralがこの分野で何をするのか興味津々だけど、資金が尽きたらどうなるか心配だよね。

Someone 2025-04-21T18:17:42

>テンプレート文字列が有効なHTMLまたはSQLに変換されると推測する唯一の方法は、文字列内の明らかな構文を基にすることだ”
それだけじゃないよ。使われ方も見れるじゃん。エディターが有名なライブラリでのt-stringの使い方を知ってて、どのt-stringがライブラリの関数に渡されてるか追跡して、t-stringが従うべき文法を推測できる。ズルいかって?ある意味そうだけど、便利だし、プログラマーにとっては価値があると思うよ。

pphysch 2025-04-21T18:04:51

Pythonは10年前から型アノテーションがあるし、最近のIDEはそれを解釈できるんだよ。query: SQL = t”SELECT ...”って書くのは、DXが向上するなら安いもんだよ。

TekMol 2025-04-21T08:37:21

これって、次のようなSQLの構文をneatに書けるようになるってこと?
city = ‘London’
min_age = 21
# Find all users in London who are 21 or older:
users = db.get(t’
SELECT * FROM users
WHERE city={city} AND age>{min_age}
’)
db.get()関数がテンプレートを受け入れるなら、そうなるはずだよね?もしそうなら、今までで一番SQLを使いやすくする方法かも!

fweimer 2025-04-21T08:56:46

TclのSQLite拡張も似たようなことができるよ。
db1 eval {INSERT INTO t1 VALUES(5,$bigstring)}
https://sqlite.org/tclsqlite.html#the_eval_method

zelphirkalt 2025-04-21T13:32:55

結局のところ、プリペアドステートメントを使うのが適切な方法じゃないの?もしちゃんとプリペアドステートメントを使ってるなら、このt-stringってSQLの利用において何の意味があるの?

scott_w 2025-04-21T16:07:17

記事にもあるように、みんなプリペアドステートメントを使ってないんだよ。代わりに、f-stringの方が便利だからそっちを使っちゃうんだ。

vultour 2025-04-21T18:44:16

後方互換性を維持するために、テンプレートしか受け付けない新しいメソッドが追加されるだろうね。そうなると、文字列を渡すのを止めさせる努力が無駄になっちゃう。PHPを始めた15年前には、プリペアドステートメントがSQLクエリを実行する推奨方法だったのに。SQLインジェクションに対して脆弱なコードを書くべきじゃないよ。

neonsunset 2025-04-21T09:35:30

>This would be the nicest way to use SQL I have seen yet.”
EF/EF Coreは何年も前からあるよ!https://learn.microsoft.com/en-us/ef/core/querying/sql-queries

nurettin 2025-04-21T09:47:29

長年使ってたけど、モデル作るのにビジュアルデザイナー使わなきゃいけなくて、これがまた遅くてバグだらけだったんだよね。マジで毎日イライラもんだったわ。UIがデータベースの関係壊すの見張ってなきゃいけないとか、マジ勘弁。

neonsunset 2025-04-21T09:57:18

今どき誰も使ってないでしょ、たぶん過去5年くらいは。今は https://learn.microsoft.com/en-us/ef/core/modeling/#use-data… を使うのが普通。これは完全に独立した、レガシーなVSの拡張機能で、EFとかEF Coreとは別物。

jbaiter 2025-04-21T08:47:43

マジ勘弁。シンタックスシュガーとしては良いけど、SQLインジェクションの脆弱性とパラメーター化されたクエリの違いが、見落としやすい一文字だけになっちゃった。

JimDabell 2025-04-21T09:07:30

t-stringは__str__()メソッドのないTemplateオブジェクトを生成するから、f-stringと間違えて使うことはないよ。コードが文字列を期待するならTemplate渡したらエラーになるし、Templateを期待するなら文字列渡したらエラーになる。

crazygringo 2025-04-21T14:29:02

>コードがTemplateを期待するなら文字列渡したらエラーになる。
問題はそこなんだよねー。ほとんどの場合、エラーにならない可能性が高いってこと。
SQLクエリにはパラメーターがないものも多いし。テーブルの行数とか取得するだけなら、生の文字列で全然OK。
sqlite3は本当に文字列を許可しないの?パラメーターがない場合でも、テンプレートを強制するの?
そうあるべきだって主張できるけど、それは入力に優しくないし、後方互換性を壊すよね。もしかしたら、モジュールに厳密な動作を有効にするフラグがあって、10年後にはデフォルトになるかも?

WorldMaker 2025-04-21T15:24:31

db.execute(t”Select Count(1) from someTable”)

パラメーター化されてないクエリに、生の文字列の代わりにたった一文字追加するだけ。「強制」するってことね。t-string自体はパラメーターなくてもちゃんと動く。
テンプレート専用APIに切り替えるのは後方互換性の問題があるけど、テンプレート専用APIは、パラメーターの数に関係なく、すべての文字列の前にtをつけるだけなら、そんなに「優しくない」ってわけでもない。

crazygringo 2025-04-21T15:34:43

他の場所ではそんなことしなくていいじゃん?変数入れないのにfつけることないし。Pythonの入力は寛容なのが普通だし。タプルが欲しいところにリスト渡せたり、floatが欲しいところにint渡せたり、単一のアイテムのタプルの代わりにアイテム直接渡せたりするし。Regex関数も普通の文字列でもRegex文字列でも受け付けるし、Regex文字列を強制しないし。
どんな場合でも特定の種類の文字列を使うように強制されるのは、Pythonの伝統的なやり方とは違うよね。安全なのはわかるけど、間違いなく優しくないから、モジュールのメンテナーがどう扱うか気になる。

もっとコメントを表示(3)
scott_w 2025-04-21T16:11:31

えー…それ違うくない?Pythonは寛容な場合もあるけど、いつもじゃないよ。完全にツール次第。ライブラリが追いつくまで時間がかかるけど、t-stringを強制するライブラリを作る人は絶対いると思う。たとえ裏でレガシーライブラリのために分解しててもね。

crazygringo 2025-04-21T16:19:30

何が違うの?Pythonの入力は普通寛容じゃん。いつもって言ったわけじゃないし。Pythonで入力に厳格なのが普通で、寛容なのが例外だって言うの?

scott_w 2025-04-21T16:29:01

Pythonが正当な理由もなく異なる型を盲目的に交換できるってこと?そんなことないよ。型が違う場合は、Pythonは入力に厳格なのが普通だよ。例えば、Decimal(‘3.0’) / 1.5 を試してみて。エラーになるでしょ、当然だけど。

crazygringo 2025-04-21T18:47:16

えーと…でも普通はそうじゃん?例えば、Decimal(’3.0’) / 2を試してみて。ちゃんと動くよ。floatだとダメなのは当然。それがポイントでしょ。基本的には型には寛容だけど、そうしない理由がある時は別ってこと。4 + Trueとかやっても5が返ってくるし。これこそ「意味もなく違う型を混ぜてる」って言えるんじゃない?Regexもr-string限定じゃないし。Pythonは入力には寛容な姿勢だよ。type hintingだって後付けだし。JavaScriptほどじゃないけど、かなり寛容だと思うけどな。そうじゃないって言うのは無理があると思う。

scott_w 2025-04-21T19:22:00

Decimalとintの混合は良い理由があるからOK。floatは精度が問題。boolとintの混合は良くない。Pythonが抱え続けるべきじゃない実装の悪い点。Pythonにはbool型がないってことだよ。TrueとFalseはただの名前付きの整数。マジで愚かでそうあるべきじゃないけど、昔からの理由でそうなってる。regexの例も意味不明。stringとr-stringは同じもの。インタープリタから見たら区別ないのに、どうやってregex関数がr-stringを強制できるの?違うべきかもしれないけど、Python 4.0がないと無理。

crazygringo 2025-04-21T20:47:09

>そんな例を出すなんて信じられない。もしチームのプログラマーがそんなことしたらクビにするレベル。
それって、俺とは違う話をしてない?
俺はただPythonを説明してるだけ。擁護してるわけじゃない。Trueを足せる理由も知ってるから例に出したんだし。r-stringがただのstringなのも分かってる。Pythonはr-stringを別のオブジェクトにして、バックスラッシュエラーをなくせたのにそうしなかった。
俺の言いたいことは、Pythonicなものって結構何でも受け入れるってこと。type hintだって強制じゃないし。君はそうあるべきじゃないと思ってるみたいだけど、Pythonが厳しい言語だって言うのは違う。

scott_w 2025-04-21T21:14:52

>Pythonicなものって結構何でも受け入れるってこと
stringをstringとして、intをintとして使うのは「何でも受け入れる」わけじゃない。プログラミング言語の基礎だよ!duck typingと「何でも受け入れる」を混同してるんじゃない?標準ライブラリでも互換性のあるインターフェースを使うべきって考えはあるよ。generatorをlistが必要な関数に渡して痛い目を見たことなんて何回もあるし。

0cf8612b2e1e 2025-04-21T16:12:32

変数を使わないならf-stringは使わないな。
Lintersも変数が無いf-stringには文句を言うし。t-stringも同じだと思う。

davepeck 2025-04-21T17:27:52

上で議論されてる理由から、t-stringもそうなるかは分からないな。frameworkやlibraryが対応するには時間がかかると思うし(後方互換性を維持しながら)、ベストプラクティスがlintingツールとかに浸透するのにも時間がかかると思う。

0cf8612b2e1e 2025-04-21T20:22:59

stringが使える場所ならt-stringも使えるなら、パラメータがないt-stringはコードのにおい(linting error)。専用のtemplate-string APIがあるなら、普通のstringを使うのをやめると後方互換性がなくなるってこと。

davepeck 2025-04-21T20:39:10

>stringが使える場所ならt-stringも使える
違うよ。型が違う。t-stringはstrじゃない。
それを活かすかどうかは良いframework/APIデザイン次第。

0cf8612b2e1e 2025-04-21T21:43:07

libraryの作者はどっちの型を受け入れるか決めないといけない。database cursorなら、普通のstring + パラメータ引数とtemplate stringのどっちを受け入れる?それとも新しいAPIを作る?
cursor.execute(“select * from x where foo=?”, {foo=1})
# 許可しつつ
cursor.execute(t“select * from x where foo={foo}”)
# または
cursor.executetemplate(“select * from x where foo={foo}”)
executeがstringとt-stringを受け入れるなら、パラメータがないt-stringを使うのは問題だと思う。t-string専用のAPIがあるなら、パラメータの渡し方が2つに分かれるから広範囲な破壊的変更を意味する。

Mawr 2025-04-21T10:55:12

既存の関数はt-stringに対応しないと思うよ。代わりにt-string専用の新しい関数が作られるんじゃないかな。

xorcist 2025-04-21T11:58:04

strcpyとかstrncpyとかstrlcpyみたいに、ドキュメントだけが生き残って、チュートリアルとか古いコードからコピペされまくって、新しいものが普及しないリスクがあるよね。AIがコード書く時代になるし、もっとひどくなるかも。でも、古いものを廃止すると言語自体が死んじゃうし、難しい問題だよね。静的チェックが簡単にできるようになったら、少しずつ変わっていくかもしれないね。

tubthumper8 2025-04-21T12:52:27

Pythonのtype checkerとかlinterって、特定の関数を呼んだ時に警告とかエラーを出せる機能あるのかな?それがあれば、新しいt-string専用の関数への移行を強制できるかもね。

mos_basik 2025-04-21T18:21:58

ちょっと前に、知らないコード見てたら、datetime.utcnow()に打ち消し線が引かれてたんだよね。マウスオーバーしたら、deprecatedってメッセージが出てきて。editor(vscode)とtypechecker(pyright)が、deprecatedってマークされてるのを見つけて表示してたみたい。これで、utcnow()がdeprecatedだって知ったし、自分のコードでもdeprecatedマークして、新しいバージョンを使うように促せるって学んだよ。

b3orn 2025-04-21T10:03:01

完全にテンプレート専用の新しいライブラリじゃない限り、今のコードは文字列を受け付けるし、後方互換性のために、これからも文字列を受け付け続けるんじゃないかな。

yk 2025-04-21T10:40:55

それは実装次第だね。既存のライブラリなら、こんな感じになるんじゃない?
>def get(self, query):
>  if isinstance(query, template):
>    self.get_template(query) ”テンプレートの場合”
>  else:
>    self.get_old(query) ”古いコードを壊さないように!”

hyperbovine 2025-04-21T08:54:42

OPはtをfに置き換えるって言ってるんだよ。

TekMol 2025-04-21T08:56:52

それだとget()に文字列が渡されて、エラーになるよ。get()はテンプレートを処理する関数だから。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。