mirror of
https://github.com/python/cpython.git
synced 2025-11-02 06:31:29 +00:00
[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:
parent
115477399b
commit
2ae0eb1a87
2 changed files with 33 additions and 6 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue