字符串格式 — MarkupSafe 文档
来自菜鸟教程
Markupsafe/docs/1.1.x/formatting
字符串格式
Markup 类可以用作格式字符串。 格式化为标记字符串的对象将首先被转义。
格式方法
format
方法扩展了标准的 str.format()
行为以使用 __html_format__
方法。
- 如果对象具有
__html_format__
方法,则调用它作为__format__
方法的替代。 如果给定了格式说明符,则会传递给它。 该方法必须返回一个字符串或 Markup 实例。 - 如果对象具有
__html__
方法,则会调用它。 如果传递了格式说明符并且定义了__html__
而不是__html_format__
的类,则会引发ValueError
。 - 否则将使用 Python 的默认格式行为并转义结果。
例如,要实现 User
将其 name
包装在 span
标签中,并在使用 'link'
格式说明符时添加链接:
class User(object):
def __init__(self, id, name):
self.id = id
self.name = name
def __html_format__(self, format_spec):
if format_spec == 'link':
return Markup(
'<a href="/user/{}">{}</a>'
).format(self.id, self.__html__())
elif format_spec:
raise ValueError('Invalid format spec')
return self.__html__()
def __html__(self):
return Markup(
'<span class="user">{0}</span>'
).format(self.name)
>>> user = User(3, '<script>')
>>> escape(user)
Markup('<span class="user"><script></span>')
>>> Markup('<p>User: {user:link}').format(user=user)
Markup('<p>User: <a href="/user/3"><span class="user"><script></span></a>
请参阅有关 格式字符串语法 的 Python 文档。
printf 风格的格式化
除了转义之外,百分比格式没有涉及任何特殊行为。
>>> user = User(3, '<script>')
>>> Markup('<a href="/user/%d">"%s</a>') % (user.id, user.name)
Markup('<a href="/user/3"><script></a>')
请参阅有关 printf 样式格式 的 Python 文档。