Skip to content

Improve the documentation for template strings #856

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

Merged
merged 3 commits into from
Mar 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions Doc/library/stdtypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2076,10 +2076,11 @@ expression support in the :mod:`re` module).

The formatting operations described here exhibit a variety of quirks that
lead to a number of common errors (such as failing to display tuples and
dictionaries correctly). Using the newer :ref:`formatted
string literals <f-strings>` or the :meth:`str.format` interface
helps avoid these errors. These alternatives also provide more powerful,
flexible and extensible approaches to formatting text.
dictionaries correctly). Using the newer :ref:`formatted string literals
<f-strings>`, the :meth:`str.format` interface, or :ref:`template strings
<template-strings>` may help avoid these errors. Each of these
alternatives provides their own trade-offs and benefits of simplicity,
flexibility, and/or extensibility.

String objects have one unique built-in operation: the ``%`` operator (modulo).
This is also known as the string *formatting* or *interpolation* operator.
Expand Down
30 changes: 19 additions & 11 deletions Doc/library/string.rst
Original file line number Diff line number Diff line change
Expand Up @@ -657,9 +657,15 @@ Nesting arguments and more complex examples::
Template strings
----------------

Templates provide simpler string substitutions as described in :pep:`292`.
Instead of the normal ``%``\ -based substitutions, Templates support ``$``\
-based substitutions, using the following rules:
Template strings provide simpler string substitutions as described in
:pep:`292`. A primary use case for template strings is for
internationalization (i18n) since in that context, the simpler syntax and
functionality makes it easier to translate than other built-in string
formatting facilities in Python. As an example of a library built on template
strings for i18n, see the
`flufl.i18n <http://flufli18n.readthedocs.io/en/latest/>`_ package.

Template strings support ``$``-based substitutions, using the following rules:

* ``$$`` is an escape; it is replaced with a single ``$``.

Expand Down Expand Up @@ -735,14 +741,17 @@ Here is an example of how to use a Template::
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

Advanced usage: you can derive subclasses of :class:`Template` to customize the
placeholder syntax, delimiter character, or the entire regular expression used
to parse template strings. To do this, you can override these class attributes:
Advanced usage: you can derive subclasses of :class:`Template` to customize
the placeholder syntax, delimiter character, or the entire regular expression
used to parse template strings. To do this, you can override these class
attributes:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it worth to mention that that attributes should be set before finalizing the class creation (see bpo-12518)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, good catch. I'll handle that in this PR too.


* *delimiter* -- This is the literal string describing a placeholder introducing
delimiter. The default value is ``$``. Note that this should *not* be a
regular expression, as the implementation will call :meth:`re.escape` on this
string as needed.
* *delimiter* -- This is the literal string describing a placeholder
introducing delimiter. The default value is ``$``. Note that this should
*not* be a regular expression, as the implementation will call
:meth:`re.escape` on this string as needed. Note further that you cannot
change the delimiter after class creation (i.e. a different delimiter must
be set in the subclass's class namespace).

* *idpattern* -- This is the regular expression describing the pattern for
non-braced placeholders (the braces will be added automatically as
Expand Down Expand Up @@ -787,4 +796,3 @@ 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.

4 changes: 4 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,10 @@ C API
Documentation
-------------

- bpo-19824, bpo-20314, bpo-12518: Improve the documentation for, and links
to, template strings by emphasizing their utility for internationalization,
and by clarifying some usage constraints.

- bpo-28929: Link the documentation to its source file on GitHub.

- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to
Expand Down