文字列のフォーマット—MarkupSafeのドキュメント

提供:Dev Guides
Markupsafe/docs/2.0.x/formatting
移動先:案内検索

文字列のフォーマット

Markup クラスはフォーマット文字列として使用できます。 マークアップ文字列にフォーマットされたオブジェクトが最初にエスケープされます。

フォーマット方法

formatメソッドは、標準のstr.format()動作を拡張して、__html_format__メソッドを使用します。

  1. オブジェクトに__html_format__メソッドがある場合、__format__メソッドの代わりとして呼び出されます。 指定されている場合は、フォーマット指定子が渡されます。 このメソッドは、文字列または Markup インスタンスを返す必要があります。
  2. オブジェクトに__html__メソッドがある場合、そのオブジェクトが呼び出されます。 フォーマット指定子が渡され、クラスが__html__を定義したが、__html_format__は定義しなかった場合、ValueErrorが発生します。
  3. それ以外の場合は、Pythonのデフォルトの形式の動作が使用され、結果はエスケープされます。

たとえば、namespanタグでラップし、"link"形式指定子を使用するときにリンクを追加するUserを実装するには、次のようにします。

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のドキュメントを参照してください。