Skip to content

Commit 507bf30

Browse files
committed
Add t-string support to pprint with expand=True
1 parent 12c9433 commit 507bf30

File tree

2 files changed

+92
-12
lines changed

2 files changed

+92
-12
lines changed

Lib/pprint.py

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -737,21 +737,53 @@ def _pprint_user_string(self, object, stream, indent, allowance, context, level)
737737

738738
def _pprint_template(self, object, stream, indent, allowance, context, level):
739739
cls_name = object.__class__.__name__
740-
indent += len(cls_name) + 1
741-
items = (("strings", object.strings),
742-
("interpolations", object.interpolations))
743-
stream.write(cls_name + '(')
744-
self._format_namespace_items(items, stream, indent, allowance, context, level)
745-
stream.write(')')
740+
if self._expand:
741+
indent += self._indent_per_level
742+
else:
743+
indent += len(cls_name) + 1
744+
745+
items = (
746+
("strings", object.strings),
747+
("interpolations", object.interpolations),
748+
)
749+
stream.write(self._format_block_start(cls_name + "(", indent))
750+
self._format_namespace_items(
751+
items, stream, indent, allowance, context, level
752+
)
753+
stream.write(
754+
self._format_block_end(")", indent - self._indent_per_level)
755+
)
746756

747757
def _pprint_interpolation(self, object, stream, indent, allowance, context, level):
748758
cls_name = object.__class__.__name__
749-
indent += len(cls_name)
750-
items = (object.value, object.expression,
751-
object.conversion, object.format_spec)
752-
stream.write(cls_name + '(')
753-
self._format_items(items, stream, indent, allowance, context, level)
754-
stream.write(')')
759+
if self._expand:
760+
indent += self._indent_per_level
761+
items = (
762+
("value", object.value),
763+
("expression", object.expression),
764+
("conversion", object.conversion),
765+
("format_spec", object.format_spec),
766+
)
767+
stream.write(self._format_block_start(cls_name + "(", indent))
768+
self._format_namespace_items(
769+
items, stream, indent, allowance, context, level
770+
)
771+
stream.write(
772+
self._format_block_end(")", indent - self._indent_per_level)
773+
)
774+
else:
775+
indent += len(cls_name)
776+
items = (
777+
object.value,
778+
object.expression,
779+
object.conversion,
780+
object.format_spec,
781+
)
782+
stream.write(cls_name + "(")
783+
self._format_items(
784+
items, stream, indent, allowance, context, level
785+
)
786+
stream.write(")")
755787

756788
t = t"{0}"
757789
_dispatch[type(t).__repr__] = _pprint_template

Lib/test/test_pprint.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,54 @@ def test_template(self):
15471547
's',
15481548
'z'),))""")
15491549

1550+
def test_expand_template(self):
1551+
d = t""
1552+
self.assertEqual(
1553+
pprint.pformat(d, expand=True),
1554+
"Template(strings=('',), interpolations=())",
1555+
)
1556+
name = "World"
1557+
d = t"Hello {name}"
1558+
self.assertEqual(
1559+
pprint.pformat(d, width=40, indent=4, expand=True),
1560+
"""\
1561+
Template(
1562+
strings=('Hello ', ''),
1563+
interpolations=(
1564+
Interpolation(
1565+
value='World',
1566+
expression='name',
1567+
conversion=None,
1568+
format_spec='',
1569+
),
1570+
),
1571+
)""",
1572+
)
1573+
ver = {3.13: False, 3.14: True}
1574+
d = t"Hello { {"name": "Python", "version": ver}!s:z}!"
1575+
self.assertEqual(
1576+
pprint.pformat(d, width=40, indent=4, expand=True),
1577+
"""\
1578+
Template(
1579+
strings=('Hello ', '!'),
1580+
interpolations=(
1581+
Interpolation(
1582+
value={
1583+
'name': 'Python',
1584+
'version': {
1585+
3.13: False,
1586+
3.14: True,
1587+
},
1588+
},
1589+
expression=' {"name": "Python", '
1590+
'"version": ver}',
1591+
conversion='s',
1592+
format_spec='z',
1593+
),
1594+
),
1595+
)""",
1596+
)
1597+
15501598
def test_expand_dataclass(self):
15511599
@dataclasses.dataclass
15521600
class DummyDataclass:

0 commit comments

Comments
 (0)