-
-
Notifications
You must be signed in to change notification settings - Fork 33.1k
gh-132661: Document t-strings and templatelib
#135229
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 11 commits
5a8dbfa
09a1e9e
ec44c2b
d8904b6
550aa6d
a20e058
1f30739
d935dd6
1e47362
7b660be
00a535d
fcd74e6
a796f5d
21d337c
d043381
9a0a301
f2e5ca4
8484b81
56ef703
5a8cf1b
127ebc6
73e1222
530cb6d
eaec534
05b5beb
680189a
71ddbf4
1c0ed70
ecc86c3
64c6758
16a995d
7f376d7
9e87880
574c29c
6f0f95a
95df68f
e562c4e
25d9a6f
72b36fe
15dd810
fd38fba
84dbc16
54914fe
7eca01e
687c506
3827427
79169d1
5d7491c
115eaa5
04c2e8d
2da418b
9070840
5af0434
437320d
d69d8e0
ae6f072
6446762
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -198,8 +198,9 @@ Format String Syntax | |||||
The :meth:`str.format` method and the :class:`Formatter` class share the same | ||||||
syntax for format strings (although in the case of :class:`Formatter`, | ||||||
subclasses can define their own format string syntax). The syntax is | ||||||
related to that of :ref:`formatted string literals <f-strings>`, but it is | ||||||
less sophisticated and, in particular, does not support arbitrary expressions. | ||||||
related to that of :ref:`formatted string literals <f-strings>` and | ||||||
:ref:`template string literals <t-strings>`, but it is less sophisticated | ||||||
and, in particular, does not support arbitrary expressions. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
.. index:: | ||||||
single: {} (curly brackets); in string formatting | ||||||
|
@@ -306,7 +307,7 @@ Format Specification Mini-Language | |||||
|
||||||
"Format specifications" are used within replacement fields contained within a | ||||||
format string to define how individual values are presented (see | ||||||
:ref:`formatstrings` and :ref:`f-strings`). | ||||||
:ref:`formatstrings`, :ref:`f-strings`, and :ref:`t-strings`). | ||||||
They can also be passed directly to the built-in | ||||||
:func:`format` function. Each formattable type may define how the format | ||||||
specification is to be interpreted. | ||||||
|
@@ -972,3 +973,9 @@ Helper functions | |||||
or ``None``, runs of whitespace characters are replaced by a single space | ||||||
and leading and trailing whitespace are removed, otherwise *sep* is used to | ||||||
split and join the words. | ||||||
|
||||||
|
||||||
|
||||||
.. toctree:: | ||||||
|
||||||
string.templatelib.rst |
davepeck marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,156 @@ | ||||||||||
:mod:`!string.templatelib` --- Templates and Interpolations for t-strings | ||||||||||
========================================================================= | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
.. module:: string.templatelib | ||||||||||
:synopsis: Support for t-string literals. | ||||||||||
|
||||||||||
**Source code:** :source:`Lib/string/templatelib.py` | ||||||||||
|
||||||||||
-------------- | ||||||||||
|
||||||||||
|
||||||||||
.. seealso:: | ||||||||||
|
||||||||||
:ref:`f-strings` -- Format strings (f-strings) | ||||||||||
|
||||||||||
|
||||||||||
.. _templatelib-template: | ||||||||||
|
||||||||||
Template | ||||||||||
-------- | ||||||||||
|
||||||||||
The :class:`Template` class describes the contents of a template string. | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
The most common way to create a new :class:`Template` instance is to use the t-string literal syntax. This syntax is identical to that of :ref:`f-strings`, except that the string is prefixed with a ``t`` instead of an ``f``. For example, the following code creates a :class:`Template` that can be used to format strings: | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> greeting = t"Hello {name}!" | ||||||||||
>>> type(greeting) | ||||||||||
<class 'string.templatelib.Template'> | ||||||||||
>>> print(list(greeting)) | ||||||||||
['Hello ', Interpolation('World', 'name', None, ''), '!'] | ||||||||||
|
||||||||||
It is also possible to create a :class:`Template` directly, using its constructor. This takes an arbitrary collection of strings and :class:`Interpolation` instances: | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
>>> from string.templatelib import Interpolation, Template | ||||||||||
>>> name = "World" | ||||||||||
>>> greeting = Template("Hello, ", Interpolation(name, "name"), "!") | ||||||||||
>>> print(list(greeting)) | ||||||||||
['Hello, ', Interpolation('World', 'name', None, ''), '!'] | ||||||||||
|
||||||||||
.. class:: Template(*args) | ||||||||||
|
||||||||||
Create a new :class:`Template` object. | ||||||||||
|
||||||||||
:param args: A mix of strings and :class:`Interpolation` instances in any order. | ||||||||||
:type args: str | Interpolation | ||||||||||
|
||||||||||
If two or more consecutive strings are passed, they will be concatenated into a single value in the :attr:`~Template.strings` attribute. For example, the following code creates a :class:`Template` with a single final string: | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
>>> from string.templatelib import Template | ||||||||||
>>> greeting = Template("Hello ", "World", "!") | ||||||||||
>>> print(greeting.strings) | ||||||||||
('Hello World!',) | ||||||||||
|
||||||||||
If two or more consecutive interpolations are passed, they will be treated as separate interpolations and an empty string will be inserted between them. For example, the following code creates a template with a single value in the :attr:`~Template.strings` attribute: | ||||||||||
|
||||||||||
>>> from string.templatelib import Interpolation, Template | ||||||||||
>>> greeting = Template(Interpolation("World", "name"), Interpolation("!", "punctuation")) | ||||||||||
>>> print(greeting.strings) | ||||||||||
('', '', '') | ||||||||||
|
||||||||||
.. attribute:: strings | ||||||||||
:type: tuple[str, ...] | ||||||||||
Comment on lines
+105
to
+106
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think everything in the next few sections is over-indented by one space
Suggested change
|
||||||||||
|
||||||||||
A :ref:`tuple <tut-tuples>` of the static strings in the template. | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why link to the tutorial?
Suggested change
|
||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(t"Hello {name}!".strings) | ||||||||||
('Hello ', '!') | ||||||||||
|
||||||||||
Empty strings *are* included in the tuple: | ||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(t"Hello {name}{name}!".strings) | ||||||||||
('Hello ', '', '!') | ||||||||||
|
||||||||||
.. attribute:: interpolations | ||||||||||
:type: tuple[Interpolation, ...] | ||||||||||
Comment on lines
+132
to
+133
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
|
||||||||||
A tuple of the interpolations in the template. | ||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(t"Hello {name}!".interpolations) | ||||||||||
(Interpolation('World', 'name', None, ''),) | ||||||||||
|
||||||||||
|
||||||||||
.. attribute:: values | ||||||||||
:type: tuple[Any, ...] | ||||||||||
Comment on lines
+147
to
+148
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
|
||||||||||
A tuple of all interpolated values in the template. | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(t"Hello {name}!".values) | ||||||||||
('World',) | ||||||||||
|
||||||||||
.. method:: __iter__() | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
Iterate over the template, yielding each string and :class:`Interpolation` in order. | ||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(list(t"Hello {name}!")) | ||||||||||
['Hello ', Interpolation('World', 'name', None, ''), '!'] | ||||||||||
|
||||||||||
Empty strings are *not* included in the iteration: | ||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> print(list(t"Hello {name}{name}")) | ||||||||||
['Hello ', Interpolation('World', 'name', None, ''), Interpolation('World', 'name', None, '')] | ||||||||||
|
||||||||||
:returns: An iterable of all the parts in the template. | ||||||||||
:rtype: typing.Iterator[str | Interpolation] | ||||||||||
|
||||||||||
.. class:: Interpolation(*args) | ||||||||||
|
||||||||||
Create a new :class:`Interpolation` object. | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
:param value: The evaluated, in-scope result of the interpolation. | ||||||||||
:type value: object | ||||||||||
|
||||||||||
:param expression: The original *text* of the interpolation's Python :ref:`expressions <expressions>`. | ||||||||||
:type expression: str | ||||||||||
|
||||||||||
:param conversion: The optional :ref:`conversion <formatstrings>` to be used, one of r, s, and a,. | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
:type value: Literal["a", "r", "s"] | None | ||||||||||
|
||||||||||
:param format_spec: An optional, arbitrary string used as the :ref:`format specification <formatspec>` to present the value. | ||||||||||
:type expression: str = "" | ||||||||||
|
||||||||||
The :class:`Interpolation` type represents an expression inside a template string. It is shallow immutable -- its attributes cannot be reassigned. | ||||||||||
davepeck marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||
|
||||||||||
>>> name = "World" | ||||||||||
>>> template = t"Hello {name}" | ||||||||||
>>> template.interpolations[0].value | ||||||||||
'World' | ||||||||||
>>> template.interpolations[0].value = "Galaxy" | ||||||||||
Traceback (most recent call last): | ||||||||||
File "<input>", line 1, in <module> | ||||||||||
AttributeError: readonly attribute | ||||||||||
|
||||||||||
While f-strings and t-strings are largely similar in syntax and expectations, the :attr:`~Interpolation.conversion` and :attr:`~Interpolation.format_spec` behave differently. With f-strings, these are applied to the resulting value automatically. For example, in this ``format_spec``: | ||||||||||
Check warning on line 140 in Doc/library/string.templatelib.rst
|
||||||||||
|
||||||||||
>>> value = 42 | ||||||||||
>>> f"Value: {value:.2f}" | ||||||||||
'Value: 42.00' | ||||||||||
|
||||||||||
With a t-string :class:`!Interpolation`, the template function is expected to apply this to the value: | ||||||||||
|
||||||||||
>>> value = 42 | ||||||||||
>>> template = t"Value: {value:.2f}" | ||||||||||
>>> template.interpolations[0].value | ||||||||||
42 | ||||||||||
|
||||||||||
.. property:: __match_args__ | ||||||||||
|
||||||||||
:returns: A tuple of the attributes to use for structural pattern matching. | ||||||||||
:rtype: (Literal["value"], Literal["expression"], Literal["conversion"], Literal["format_spec"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.