https://github.com/python/cpython/commit/5b969fd64502a6e2ba6513e2b18beaeae58b8aa1
commit: 5b969fd64502a6e2ba6513e2b18beaeae58b8aa1
branch: main
author: Adam Turner <[email protected]>
committer: lysnikolaou <[email protected]>
date: 2025-07-15T11:56:42+02:00
summary:
GH-132661: Add ``string.templatelib.convert()`` (#135217)
files:
M Lib/string/templatelib.py
M Lib/test/test_string/test_templatelib.py
diff --git a/Lib/string/templatelib.py b/Lib/string/templatelib.py
index 14b40e1e36e30b..8164872432ad09 100644
--- a/Lib/string/templatelib.py
+++ b/Lib/string/templatelib.py
@@ -1,15 +1,22 @@
"""Support for template string literals (t-strings)."""
-__all__ = [
- "Interpolation",
- "Template",
-]
-
t = t"{0}"
Template = type(t)
Interpolation = type(t.interpolations[0])
del t
+def convert(obj, /, conversion):
+ """Convert *obj* using formatted string literal semantics."""
+ if conversion is None:
+ return obj
+ if conversion == 'r':
+ return repr(obj)
+ if conversion == 's':
+ return str(obj)
+ if conversion == 'a':
+ return ascii(obj)
+ raise ValueError(f'invalid conversion specifier: {conversion}')
+
def _template_unpickle(*args):
import itertools
diff --git a/Lib/test/test_string/test_templatelib.py
b/Lib/test/test_string/test_templatelib.py
index adaf590e64dad6..1c86717155fd5a 100644
--- a/Lib/test/test_string/test_templatelib.py
+++ b/Lib/test/test_string/test_templatelib.py
@@ -1,7 +1,7 @@
import pickle
import unittest
from collections.abc import Iterator, Iterable
-from string.templatelib import Template, Interpolation
+from string.templatelib import Template, Interpolation, convert
from test.test_string._support import TStringBaseCase, fstring
@@ -169,5 +169,25 @@ def test_exhausted(self):
self.assertRaises(StopIteration, next, template_iter)
+class TestFunctions(unittest.TestCase):
+ def test_convert(self):
+ from fractions import Fraction
+
+ for obj in ('Café', None, 3.14, Fraction(1, 2)):
+ with self.subTest(f'{obj=}'):
+ self.assertEqual(convert(obj, None), obj)
+ self.assertEqual(convert(obj, 's'), str(obj))
+ self.assertEqual(convert(obj, 'r'), repr(obj))
+ self.assertEqual(convert(obj, 'a'), ascii(obj))
+
+ # Invalid conversion specifier
+ with self.assertRaises(ValueError):
+ convert(obj, 'z')
+ with self.assertRaises(ValueError):
+ convert(obj, 1)
+ with self.assertRaises(ValueError):
+ convert(obj, object())
+
+
if __name__ == '__main__':
unittest.main()
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]