2

__str__整数値を 16 進数で返すように定義するクラス__format__と、ユーザーの形式仕様でフォーマットされた値を返すように定義するクラスがあります。

class MyClass:
    def __init__(self, value: int):
        self._value = value

    def __str__(self):
        return '{:04X}'.format(self._value)

    def __format__(self, format_spec):
        return format_spec.format(self._value)

だから私は期待します:

'{:04X}'.format(MyClass(10)) == '000A'

 str(MyClass(10)) == '000A'

しかし、str.format呼び出しはフォーマット仕様を返すだけです04X. 私は何を間違っていますか?

4

1 に答える 1

2

仕様 (コロンの後の中括弧内の部分) のみが__format__メソッドに渡されます'04X'。これにはプレースホルダーが含まれていないためformat、それを呼び出すと単純に'04X'再びが返されます。

format_specを「渡し」たい場合はself._value、たとえば組み込みformat関数を使用して、明示的に行う必要があります。

class MyClass:
    def __init__(self, value: int):
        self._value = value

    def __str__(self):
        return '{:04X}'.format(self._value)

    def __format__(self, format_spec):
        return format(self._value, format_spec)
>>> '{:04X}'.format(MyClass(10))
'000A'
于 2019-12-10T16:06:47.257 に答える