正确使用 __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'
我有一个 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'