python - 格式化的 Python 字符串既不使用 repr 也不使用 str - 发生了什么?
问题描述
我有一个ResourceType
继承自namedtuple
and的枚举Enum
,并且我不覆盖__str__
or__repr__
任何地方。当我格式化该枚举的一个实例时,我出乎意料地得到了未修饰的值,而不是 therepr()
或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)"
最后一个值既不是 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}")
给出的输出
REPR
STR
FORMAT
推荐阅读
- sql - 如何将 SQL 数据与外部数据关联起来
- java - instanceof 确定 x 是 y 的一个实例。那么为什么在创建 x 的副本时需要强制转换呢?
- vba - 唯一值的 VBA 数组没有拾取某些数字
- sqlite - 同时访问 Sqlite 数据库
- node.js - 错误:ENOENT:没有这样的文件或目录,uv_resident_set_memory
- ruby-on-rails - 在 Rails 4 中构建 where 和 or 查询
- php - 在特定时间使用 PHP 执行 shell 脚本
- html - Angular 6 built-in date is not working in Edge/IE
- angular - 一指缩放地图框,角度为 5
- android - android studio中的Volley错误总是响应错误