t-strings
サイト
https://t-strings.help/
https://github.com/t-strings/awesome-t-strings
https://peps.python.org/pep-0750/
CPython 3.14b1以降をインストール
(2025/07/03 時点では 3.14.0b3 が最新)
code:shell
$ uv python install 3.14.0b3
$ uv python pin 3.14.0b3
t-stringの動作確認
簡単な例
code:python
Python 3.14.0b3 (main, Jul 1 2025, 18:25:34) Clang 20.1.4 on darwin
Type "help", "copyright", "credits" or "license" for more information.
>> name = "PyCon"
>> tmpl = t"hello {name}!"
>> tmpl
Template(strings=('hello ', '!'), interpolations=(Interpolation('PyCon', 'name', None, ''),))
>> for s in tmpl:
... if isinstance(s, str):
... print(s, end="")
... else:
... print(s.value, end="")
...
hello PYCON!
lower/upper
code:hello.py
# /// script
# requires-python = ">=3.14"
# ///
from dataclasses import dataclass
@dataclass
class Profile:
name: str
age: int
def __str__(self):
return f"{self.name} is {self.age:03d} years old"
@property
def tmpl(self):
return t"{self.name} is {self.age:03d} years old"
def tprint(template):
for s in template:
if isinstance(s, str):
print(s.lower(), end="")
else:
print(str(s.value).upper(), end="")
print()
def main():
profile = Profile(name="Shimizukawa", age=30)
print(profile)
tmpl = profile.tmpl
print(tmpl)
tprint(tmpl)
if __name__ == "__main__":
main()
実行
code:shell
% uv run hello.py
Shimizukawa is 030 years old
Template(strings=('', ' is ', ' years old'), interpolations=(Interpolation('Shimizukawa', 'self.name', None, ''), Interpolation(30, 'self.age', None, '03d')))
SHIMIZUKAWA is 30 years old
tdomの動作
https://github.com/t-strings/tdom
tdomのサンプル
code:tdom-exsample.py
# /// script
# requires-python = ">=3.14"
# dependencies = [
# "tdom",
# ]
# ///
from tdom import html
def render_fstring(value):
s = f"<div>Hello {value}!</div>"
print(s)
def render_tstring(value):
tmpl = t"<div>Hello {value}!</div>"
print(html(tmpl))
render_fstring("PyCon")
render_tstring("PyCon")
render_fstring("</div><script>alert('XSS')</script>")
render_tstring("</div><script>alert('XSS')</script>")
実行
code:shell
$ uv run python tdom-example.py
<div>Hello PyCon!</div>
<div>Hello PyCon!</div>
<div>Hello </div><script>alert('XSS')</script>!</div>
<div>Hello &lt;/div&gt;&lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;!</div>
sql-tstringの動作
https://github.com/pgjones/sql-tstring/
サンプル
code:sql-example.py
# /// script
# requires-python = ">=3.14"
# dependencies = [
# "sql-tstring",
# ]
# ///
from sql_tstring import sql
def render_fstring(value):
s = f"SELECT a, b, c FROM tbl WHERE a = {value}"
print(s)
def render_tstring(value):
tmpl = t"SELECT a, b, c FROM tbl WHERE a = {value}"
print(sql(tmpl))
breakpoint()
render_fstring("bp")
render_tstring("bp")
render_fstring("0; DROP TABLE tbl; --")
render_tstring("0; DROP TABLE tbl; --")
実行
code:shell
$ uv run python sql-example.py
SELECT a, b, c FROM tbl WHERE a = bp
('SELECT a , b , c FROM tbl WHERE a = ?', 'bp')
SELECT a, b, c FROM tbl WHERE a = 0; DROP TABLE tbl; --
('SELECT a , b , c FROM tbl WHERE a = ?', '0; DROP TABLE tbl; --')