【发布时间】:2014-02-19 16:54:48
【问题描述】:
我正在为 python 滚动我自己的 Enum 类,我无法让 __str__ 和 __repr__ 正常工作,我做错了什么?
In [2]: x = Enum(X=1, Y=2)
In [3]: x
Out[3]: common.utils.Enum
In [4]: str(x)
Out[4]: "<class 'common.utils.Enum'>"
In [5]: x.__repr__
Out[5]: <bound method type.reprfun of <class 'common.utils.Enum'>>
In [6]: x.__repr__()
Out[6]: 'Enum(Y=2, X=1)'
代码本身:
def Enum(*args, **kwargs):
enums = dict(zip(args, range(len(args))), **kwargs)
def reprfun(self):
res = 'Enum(' +\
', '.join(map(lambda x: '{}={}'.format(x[0],x[1]), enums.items())) +\
')'
return res
reverse = dict((value, name) for name, value in enums.items())
typedict = enums.copy()
typedict['name'] = reverse
instance = type('Enum', (), typedict)
instance.__repr__ = types.MethodType(reprfun, instance)
instance.__str__ = types.MethodType(reprfun, instance)
return instance
【问题讨论】:
-
你应该将
__repr__绑定到类,而不是实例。 -
您使用的是内置枚举 (docs.python.org/3.4/library/enum.html)、它的后端端口还是其他实现? - nm - 我看到你在滚动你自己的。你应该看看python源代码中实际枚举类的实现。