我写了一个小工具,用于解码由位标志组成的日志输出。在解码这些位标志时,我使用枚举。
python --version
Python 3.8.6
出于简洁的原因,我只想打印枚举成员名称。我已将我的问题简化为以下代码片段:
from enum import IntFlag
class Foo(IntFlag):
A = 0x01
B = 0x02
C = 0x04
def __str__(self):
return self.name
__repr__ = __str__
如果我将它们单独显示或作为列表的一部分打印,那么它们就可以正常工作。但是我无法打印一个或表达式。我想在表格上显示标志 A|B|C
。
>>> Foo.A
A
>>> Foo.B
B
>>> [Foo.A, Foo.B]
[A, C]
>>> Foo.A | Foo.B
TypeError: __repr__ returned non-string (type NoneType)
更新: 我看错了源代码的版本。对于3.8.6标签,IntFlag::__repr__
确实包含了打印每个成员的代码https://github.com/python/cpython/blob/v3.8.6/Lib/enum.py#L761
我尝试阅读 CPython 的Lib/enum.py,但无法弄清楚默认的 IntFlag(没有我的重写的__repr__
)如何以 Foo.A|Foo.B
的形式打印输出。~~
我可以看到IntFlag.__or__
通过调用__class__
返回一个新对象(我不太知道__class__
是什么)。而Enum.__repr__
只打印单个类名和枚举名。
如何编写一个__repr__
函数和一个__str__
函数,以返回当前设置的枚举成员名称的字符串表示形式?
__repr__
行为最近已经在主干分支中删除。 (始终查看您实际使用的版本的代码!) - user2357112