格式化的 Python 字符串既不使用 repr 也不使用 str - 发生了什么?

pal*_*uer 4 python string enums repr string-formatting

我有一个ResourceType继承自namedtupleand的枚举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 ?

Kem*_*emp 7

当您以这种方式将对象插入 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)