我有一个枚举 ResourceType
这两者都继承了 namedtuple
及 Enum
,而我不重写 __str__
或 __repr__
在任何地方当格式化该枚举的示例时,意外地只得到未修饰的值,而不是 repr()
或者 str()
. 这怎么可能?这叫什么?
枚举详细信息(简化):
from enum import Enum, auto
from collections import namedtuple
class ResourceType(namedtuple('ResourceType', 'value ext required'), Enum):
RGB = auto(), '.png', True
输出:
>>> repr(ResourceType.RGB)
"<ResourceType.RGB: ResourceType(value=<enum.auto object at 0x7f44b7d48d30>, ext='.png', required=True)>"
>>> str(ResourceType.RGB)
'ResourceType.RGB'
>>> f"{ResourceType.RGB}"
"ResourceType(value=<enum.auto object at 0x7f44b7d48d30>, ext='.png', required=True)"
最后一个值既不是 repr()
也不是 str()
,所以即使 namedtuple
如果提供了该字符串,为什么不同时提供str/repr?
3条答案
按热度按时间yuvru6vn1#
以这种方式将对象插入f字符串时,它将调用
__format__
方法。输出
gv8xihay2#
现在肯普和达维奥已经指出,魔术正在通过
__format__
,我可以挖得更深一点,实际上是在Enum
我们发现:class ResourceType(namedtuple('ResourceType', 'value ext required'), Enum):
RGB = auto(), '.png', True
def format(self, format_spec):
return str.format(str(self), format_spec)
pod7payv3#
这叫什么?
它是
Enum.__format__
其在enum.py中的文档字符串声明使用实际值类型返回格式,除非
__str__
已被覆盖。