字符串格式 — MarkupSafe 文档

来自菜鸟教程
Markupsafe/docs/1.1.x/formatting
跳转至:导航、​搜索

字符串格式

Markup 类可以用作格式字符串。 格式化为标记字符串的对象将首先被转义。

格式方法

format 方法扩展了标准的 str.format() 行为以使用 __html_format__ 方法。

  1. 如果对象具有 __html_format__ 方法,则调用它作为 __format__ 方法的替代。 如果给定了格式说明符,则会传递给它。 该方法必须返回一个字符串或 Markup 实例。
  2. 如果对象具有 __html__ 方法,则会调用它。 如果传递了格式说明符并且定义了 __html__ 而不是 __html_format__ 的类,则会引发 ValueError
  3. 否则将使用 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">&lt;script&gt;</span>')
>>> Markup('<p>User: {user:link}').format(user=user)
Markup('<p>User: <a href="/user/3"><span class="user">&lt;script&gt;</span></a>

请参阅有关 格式字符串语法 的 Python 文档。


printf 风格的格式化

除了转义之外,百分比格式没有涉及任何特殊行为。

>>> user = User(3, '<script>')
>>> Markup('<a href="/user/%d">"%s</a>') % (user.id, user.name)
Markup('<a href="/user/3">&lt;script&gt;</a>')

请参阅有关 printf 样式格式 的 Python 文档。