mirror of
https://github.com/python/cpython.git
synced 2026-05-06 04:37:33 -04:00
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:
@@ -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_*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user