正确使用 __format__

Proper use of __format__

我有一个 class 定义了 __str__ 到 return 的十六进制整数值和一个 __format__ 到 return 的值格式规范:

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 只调用 return 格式规范,04X。我做错了什么?

只有规范(花括号 冒号 之后的部分)被传递给 __format__ 方法,在您的例子中是 '04X'。它不包含占位符,因此在其上调用 format 只会再次 return '04X'

如果您想 "pass on" 将 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'