gh-134551: Add t-strings support to pprint (#134577)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
This commit is contained in:
Loïc Simon
2026-04-14 13:37:41 +02:00
committed by GitHub
parent 5ce0fe8b6c
commit 74a4f8c1d0
4 changed files with 141 additions and 1 deletions
+5 -1
View File
@@ -1551,7 +1551,11 @@ pprint
:func:`pprint.pformat`, :func:`pprint.pp`. If true, the output will be
formatted similar to pretty-printed :func:`json.dumps` when
*indent* is supplied.
(Contributed by Stefan Todoran and Semyon Moroz in :gh:`112632`.)
(Contributed by Stefan Todoran, Semyon Moroz and Hugo van Kemenade in
:gh:`112632`.)
* Add t-string support to :mod:`pprint`.
(Contributed by Loïc Simon and Hugo van Kemenade in :gh:`134551`.)
sre_*
+55
View File
@@ -735,6 +735,61 @@ class PrettyPrinter:
_dispatch[_collections.UserString.__repr__] = _pprint_user_string
def _pprint_template(self, object, stream, indent, allowance, context, level):
cls_name = object.__class__.__name__
if self._expand:
indent += self._indent_per_level
else:
indent += len(cls_name) + 1
items = (
("strings", object.strings),
("interpolations", object.interpolations),
)
stream.write(self._format_block_start(cls_name + "(", indent))
self._format_namespace_items(
items, stream, indent, allowance, context, level
)
stream.write(
self._format_block_end(")", indent - self._indent_per_level)
)
def _pprint_interpolation(self, object, stream, indent, allowance, context, level):
cls_name = object.__class__.__name__
if self._expand:
indent += self._indent_per_level
items = (
("value", object.value),
("expression", object.expression),
("conversion", object.conversion),
("format_spec", object.format_spec),
)
stream.write(self._format_block_start(cls_name + "(", indent))
self._format_namespace_items(
items, stream, indent, allowance, context, level
)
stream.write(
self._format_block_end(")", indent - self._indent_per_level)
)
else:
indent += len(cls_name)
items = (
object.value,
object.expression,
object.conversion,
object.format_spec,
)
stream.write(cls_name + "(")
self._format_items(
items, stream, indent, allowance, context, level
)
stream.write(")")
t = t"{0}"
_dispatch[type(t).__repr__] = _pprint_template
_dispatch[type(t.interpolations[0]).__repr__] = _pprint_interpolation
del t
def _safe_repr(self, object, context, maxlevels, level):
# Return triple (repr_string, isreadable, isrecursive).
typ = type(object)
+80
View File
@@ -1515,6 +1515,86 @@ ValuesView({'a': 6,
'jumped over a '
'lazy dog'}""")
def test_template(self):
d = t""
self.assertEqual(pprint.pformat(d),
"Template(strings=('',), interpolations=())")
self.assertEqual(pprint.pformat(d), repr(d))
self.assertEqual(pprint.pformat(d, width=1),
"""\
Template(strings=('',),
interpolations=())""")
name = "World"
d = t"Hello {name}"
self.assertEqual(pprint.pformat(d),
"""\
Template(strings=('Hello ', ''),
interpolations=(Interpolation('World', 'name', None, ''),))""")
ver = {3.13: False, 3.14: True}
d = t"Hello { {"name": "Python", "version": ver}!s:z}!"
self.assertEqual(pprint.pformat(d, width=1),
"""\
Template(strings=('Hello ',
'!'),
interpolations=(Interpolation({'name': 'Python',
'version': {3.13: False,
3.14: True}},
' '
'{"name": '
'"Python", '
'"version": '
'ver}',
's',
'z'),))""")
def test_expand_template(self):
d = t""
self.assertEqual(
pprint.pformat(d, expand=True),
"Template(strings=('',), interpolations=())",
)
name = "World"
d = t"Hello {name}"
self.assertEqual(
pprint.pformat(d, width=40, indent=4, expand=True),
"""\
Template(
strings=('Hello ', ''),
interpolations=(
Interpolation(
value='World',
expression='name',
conversion=None,
format_spec='',
),
),
)""",
)
ver = {3.13: False, 3.14: True}
d = t"Hello { {"name": "Python", "version": ver}!s:z}!"
self.assertEqual(
pprint.pformat(d, width=40, indent=4, expand=True),
"""\
Template(
strings=('Hello ', '!'),
interpolations=(
Interpolation(
value={
'name': 'Python',
'version': {
3.13: False,
3.14: True,
},
},
expression=' {"name": "Python", '
'"version": ver}',
conversion='s',
format_spec='z',
),
),
)""",
)
def test_expand_dataclass(self):
@dataclasses.dataclass
class DummyDataclass:
@@ -0,0 +1 @@
Add t-strings support to pprint functions