0

PEP 3101はAdvanced String Formattingを指定します。とりわけ、フォーマット文字列 (例: {:.2f}) の新しい構文の仕様と、カスタム タイプが独自のフォーマットを制御する方法を定義します。これは、以下を実装することによって行われます。

def __format__(value, format_spec):
     # Your code here

文字列フォーマット コードには、変換フラグを含めることができます。例: "{0!r:20}".format("Hello")、ここで!rは を意味しconvert the the value to a string using repr()ます。ただし、__format__コロンの後の値:(つまり、format_spec) のみを取得します。その理由 (コードではなく設計上の決定) を知りたいのですが、なぜですか? !の後にすべてを提供すると、より柔軟になると思います。

4

1 に答える 1

1

コロンの前の部分は、文字列の書式設定でのみ使用され、実際の値自体の書式設定ではなく、テンプレート関数です。

コロンの後の部分は個別に処理され、format()関数を使用して指定することもできます。

>>> format(234, '02x')
'ea'

最小 2 文字の小文字でゼロが埋め込まれた 16 進数として数値をフォーマットします。.__format__()フックできるのはこの機能です。これは、値の書式設定の業務上の目的です。

コロンの前の部分はfield_name、文字列フォーマッタがフォーマットする値を取得する方法を指定します。値をフォーマットするとき、フィールドがどのように決定されたかはまったく問題になりません。は、 を呼び出す値を特定し、その値の別の変換方法 (または) を指定するfield_name場合にのみ役立ちます。.__format__()!r!s

byメソッドは無視され!r代わりに使用されることに注意してください。同じことがとにも当てはまります。.__format__().__repr__()!s.__str__()

>>> class Foo(object):
...     def __repr__(self): return '<Foo repr>'
...     def __str__(self): return 'Foo as string'
...     def __format__(self, spec): return 'Formatting Foo as {}'.format(spec)
... 
>>> '{:02x}'.format(Foo())
'Formatting Foo as 02x'
>>> '{!s}'.format(Foo())
'Foo as string'
>>> '{!r}'.format(Foo())
'<Foo repr>'
于 2013-07-02T14:48:17.740 に答える