Title: Misleading descriptions in the introduce of "Template" · Issue #137119 · python/cpython · GitHub
Open Graph Title: Misleading descriptions in the introduce of "Template" · Issue #137119 · python/cpython
X Title: Misleading descriptions in the introduce of "Template" · Issue #137119 · python/cpython
Description: Documentation The template can then be combined with functions that operate on the template’s structure to produce a str or a string-like result. For example, sanitizing input: template = t"
{evil}
" assert html(template) == "<...
Open Graph Description: Documentation The template can then be combined with functions that operate on the template’s structure to produce a str or a string-like result. For example, sanitizing input: template = t"
{evi...
X Description: Documentation The template can then be combined with functions that operate on the template’s structure to produce a str or a string-like result. For example, sanitizing input: template = t"&l...
Opengraph URL: https://github.com/python/cpython/issues/137119
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Misleading descriptions in the introduce of \"Template\"","articleBody":"# Documentation\n\u003eThe template can then be combined with functions that operate on the template’s structure to produce a [str](https://docs.python.org/3.14/library/stdtypes.html#str) or a string-like result. For example, sanitizing input:\n\n\u003e```evil = \"\u003cscript\u003ealert('evil')\u003c/script\u003e\"\n\u003etemplate = t\"\u003cp\u003e{evil}\u003c/p\u003e\"\n\u003eassert html(template) == \"\u003cp\u003e\u0026lt;script\u0026gt;alert('evil')\u0026lt;/script\u0026gt;\u003c/p\u003e\"\n\n\u003eAs another example, generating HTML attributes from data:\n\n\u003e```attributes = {\"src\": \"shrubbery.jpg\", \"alt\": \"looks nice\"}\n\u003etemplate = t\"\u003cimg {attributes}\u003e\"\n\u003eassert html(template) == '\u003cimg src=\"shrubbery.jpg\" alt=\"looks nice\" /\u003e'\n\n\u003eCompared to using an f-string, the html function has access to template attributes containing the original information: static strings, interpolations, and values from the original scope. Unlike existing templating approaches, t-strings build from the well-known f-string syntax and rules. Template systems thus benefit from Python tooling as they are much closer to the Python language, syntax, scoping, and more.\n\nIn [PEP-750](https://peps.python.org/pep-0750/), the author assumed that you had defined the function `html`:\n\u003eFor example, imagine we want to generate some HTML. Using template strings, we can define an html() function that allows us to automatically sanitize content:\n\n\u003e```evil = \"\u003cscript\u003ealert('evil')\u003c/script\u003e\"\n\u003etemplate = t\"\u003cp\u003e{evil}\u003c/p\u003e\"\n\u003eassert html(template) == \"\u003cp\u003e\u0026lt;script\u0026gt;alert('evil')\u0026lt;/script\u0026gt;\u003c/p\u003e\"\n\n\u003eLikewise, our hypothetical html() function can make it easy for developers to add attributes to HTML elements using a dictionary:\n\n\u003e```attributes = {\"src\": \"shrubbery.jpg\", \"alt\": \"looks nice\"}\n\u003etemplate = t\"\u003cimg {attributes} /\u003e\"\n\u003eassert html(template) == '\u003cimg src=\"shrubbery.jpg\" alt=\"looks nice\" /\u003e'\n\nHowever, in the document, the operation \"define\" was gone, so that some users will mistakenly think that there is a function `html` that has been defined.\n\nI think that it is better to explain that the function `html` should be defined by user, like this:\n\u003eThe template can then be combined with functions that operate on the template’s structure to produce a [str](https://docs.python.org/3.14/library/stdtypes.html#str) or a string-like result. For example, sanitizing input (assuming that you have defined a function `html` that can deal with the input to html):\n","author":{"url":"https://github.com/Locked-chess-official","@type":"Person","name":"Locked-chess-official"},"datePublished":"2025-07-26T15:30:39.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/137119/cpython/issues/137119"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:35f431f6-6eb3-5e59-a5b8-1fa1abb3da9a |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B1E8:2518BB:3E7347:4FA68A:696B09A9 |
| html-safe-nonce | a24f6839b0e7036d92ff6743b89deac92d96a94edf4b063e0537b08f4ed071dd |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMUU4OjI1MThCQjozRTczNDc6NEZBNjhBOjY5NkIwOUE5IiwidmlzaXRvcl9pZCI6IjUwNzc2NjgxMDYxMzM1MDY0NzMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | de002042bb905951553eb09681bcdf10e3e363bc29aec70f313cae751f6271f9 |
| hovercard-subject-tag | issue:3265800339 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/137119/issue_layout |
| twitter:image | https://opengraph.githubassets.com/09f6b74b2365e019f6d30ed910de6d3506910e8c4352ca4ad2aa4c450b699afa/python/cpython/issues/137119 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/09f6b74b2365e019f6d30ed910de6d3506910e8c4352ca4ad2aa4c450b699afa/python/cpython/issues/137119 |
| og:image:alt | Documentation The template can then be combined with functions that operate on the template’s structure to produce a str or a string-like result. For example, sanitizing input: template = t" {evi... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Locked-chess-official |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f99f7c1d70f01da5b93e5ca90303359738944d8ab470e396496262c66e60b8d |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 82560a55c6b2054555076f46e683151ee28a19bc |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width