我有一个定义__str__以十六进制返回整数值的类,以及一个__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。我究竟做错了什么?

最佳答案

仅将规范(冒号后花括号中的部分)传递给__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'

关于python - 正确使用__format__,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59271185/

10-10 23:20