Skip to content

Add support for Template type (t-strings) to pprint #134551

Open
@loic-simon

Description

@loic-simon

Feature or enhancement

Proposal:

Update pprint functions to understand and format Template and Interpolation types:

>>> from pprint import pp
>>> name = "World"
>>> pp(t"Hello {World}")
Template(strings=('Hello ', ''),
         interpolations=(Interpolation('World', 'name', None, ''),))""")

I believe it will be quite common to play with t-strings in the REPL and other dynamic environments, where pretty formatting could help a lot. I don't know how high is the bar for adding types to the pprint registry, though.

If this is deemed worthwhile, I have a working implementation, pretty straightforward.


More complex examples (inspired from the PEP), to give a sense of what it could look like:

>>> attributes = {"id": "main"}
>>> attribute_value = "shrubbery"
>>> content = "hello"
>>> template = t"<span {attributes} data-value={attribute_value}>{content}</span>"
>>> pp(template)
Template(strings=('<span ', ' data-value=', '>', '</span>'),
         interpolations=(Interpolation({'id': 'main'}, 'attributes', None, ''),
                         Interpolation('shrubbery',
                                       'attribute_value',
                                       None,
                                       ''),
                         Interpolation('hello', 'content', None, '')))
>>>
>>> nested = t"<div>{template}</div>"
>>> pp(nested)
Template(strings=('<div>', '</div>'),
         interpolations=(Interpolation(Template(strings=('<span ',
                                                         ' data-value=',
                                                         '>',
                                                         '</span>'),
                                                interpolations=(Interpolation({'id': 'main'},
                                                                              'attributes',
                                                                              None,
                                                                              ''),
                                                                Interpolation('shrubbery',
                                                                              'attribute_value',
                                                                              None,
                                                                              ''),
                                                                Interpolation('hello',
                                                                              'content',
                                                                              None,
                                                                              ''))),
                                       'template',
                                       None,
                                       ''),))

Unfortunately, "interpolation" being a quite long word repeated 2 times in the repr of a t-string, with default formatting rules we soon have text crumpled to the right of the screen... but I believe it is still more readable than

Template(strings=('<div>', '</div>'), interpolations=(Interpolation(Template(strings=('<span ', ' da
ta-value=', '>', '</span>'), interpolations=(Interpolation({'id': 'main'}, 'attributes', None, ''),  
Interpolation('shrubbery', 'attribute_value', None, ''), Interpolation('hello', 'content', None, '')
)), 'template', None, ''),))

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibPython modules in the Lib dirtype-featureA feature request or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions