Skip to content

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

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 {name}")
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

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions