正确使用 __format__

Posted

技术标签:

【中文标题】正确使用 __format__【英文标题】:Proper use of __format__ 【发布时间】:2020-04-03 20:57:31 【问题描述】:

我有一个类定义 __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。我做错了什么?

【问题讨论】:

【参考方案1】:

只有规范(大括号中的部分冒号)被传递给__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'

【讨论】:

以上是关于正确使用 __format__的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用带有 YUV_420_888 和 MediaCodec 的 ImageReader 将视频编码为 h264 格式?

自定义输出内容 __str__() 和 __repr__() 以及__format__() 的使用

NSLog演化

format()

CString构造函数

格式化输入 \_\_format\_\_