[3.14] GH-132661: Add `string.templatelib.convert()` (GH-135217) (#136671)

GH-132661: Add ``string.templatelib.convert()`` (GH-135217)
(cherry picked from commit 5b969fd645)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2025-07-15 12:22:24 +02:00 committed by GitHub
parent 115477399b
commit 2ae0eb1a87
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 6 deletions

View file

@ -1,15 +1,22 @@
"""Support for template string literals (t-strings).""" """Support for template string literals (t-strings)."""
__all__ = [
"Interpolation",
"Template",
]
t = t"{0}" t = t"{0}"
Template = type(t) Template = type(t)
Interpolation = type(t.interpolations[0]) Interpolation = type(t.interpolations[0])
del t 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): def _template_unpickle(*args):
import itertools import itertools

View file

@ -1,7 +1,7 @@
import pickle import pickle
import unittest import unittest
from collections.abc import Iterator, Iterable 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 from test.test_string._support import TStringBaseCase, fstring
@ -169,5 +169,25 @@ def test_exhausted(self):
self.assertRaises(StopIteration, next, template_iter) 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__': if __name__ == '__main__':
unittest.main() unittest.main()