[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)."""
__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

View file

@ -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()