pal*_*uer 4 python string enums repr string-formatting
我有一个ResourceType
继承自namedtuple
and的枚举Enum
,并且我不会在任何地方重写__str__
or __repr__
。当我格式化该枚举的实例时,我意外地得到了未修饰的值,而不是repr()
或str()
. 这怎么可能?被称为什么?
枚举详细信息(简化):
from enum import Enum, auto
from collections import namedtuple
class ResourceType(namedtuple('ResourceType', 'value ext required'), Enum):
RGB = auto(), '.png', True
Run Code Online (Sandbox Code Playgroud)
输出:
>>> 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)"
Run Code Online (Sandbox Code Playgroud)
最后一个值既不是 therepr()
也不是 the str()
,所以即使namedtuple
提供该字符串,为什么它不也提供 str/repr ?
当您以这种方式将对象插入 f 字符串时,它会调用该__format__
方法。
from enum import Enum, auto
from collections import namedtuple
class ResourceType(namedtuple('ResourceType', 'value ext required'), Enum):
RGB = auto(), '.png', True
def __repr__(self):
return "REPR"
def __str__(self):
return "STR"
def __format__(self, format_spec):
return "FORMAT"
print(repr(ResourceType.RGB))
print(str(ResourceType.RGB))
print(f"{ResourceType.RGB}")
Run Code Online (Sandbox Code Playgroud)
给出输出
REPR
STR
FORMAT
Run Code Online (Sandbox Code Playgroud)