文字列のフォーマット—MarkupSafeのドキュメント
提供:Dev Guides
Markupsafe/docs/1.1.x/formatting
文字列のフォーマット
Markup クラスはフォーマット文字列として使用できます。 マークアップ文字列にフォーマットされたオブジェクトが最初にエスケープされます。
フォーマット方法
format
メソッドは、標準のstr.format()
動作を拡張して、__html_format__
メソッドを使用します。
- オブジェクトに
__html_format__
メソッドがある場合、__format__
メソッドの代わりとして呼び出されます。 指定されている場合は、フォーマット指定子が渡されます。 このメソッドは、文字列または Markup インスタンスを返す必要があります。 - オブジェクトに
__html__
メソッドがある場合、そのオブジェクトが呼び出されます。 フォーマット指定子が渡され、クラスが__html__
を定義したが、__html_format__
は定義しなかった場合、ValueError
が発生します。 - それ以外の場合は、Pythonのデフォルトの形式の動作が使用され、結果はエスケープされます。
たとえば、name
をspan
タグでラップし、'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"><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のドキュメントを参照してください。