我有一个枚举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
现在Kemp和Daweo已经指出魔法是通过
__format__
发生的,我能够深入挖掘,事实上在Enum
类中我们发现:ResourceType
也是一个混合的inEnum,这是由于namedtuple
的继承性,因此对于__format__
情况,调用被重定向到“ResourceType”namedtuple
,只使用enum实例的值,该值通过约定/实现存储在_value_
中在我的例子中,我希望
ResourceType
枚举在外部尽可能像一个枚举一样出现,尽管它也是一个namedtuple,因此我现在将其更改为:这完全等同于在
Enum.__format__
实现中强制执行“纯枚举分支”什么叫什么
是
Enum.__format__
的文档字符串在enum.py中声明它以这种方式将对象插入f字符串时,它将调用^{} 方法
输出
相关问题 更多 >
编程相关推荐