Python 3.4有一个新的枚举模块和Enum数据类型。如果您还无法切换到3.4,Enum has been backported。
由于Enum成员支持docstrings,就像所有python对象一样,我想设置它们。有没有一种简单的方法可以做到这一点?
答案 0 :(得分:5)
是的,到目前为止,这是我最喜欢的食谱。作为奖励,也不必指定整数值。这是一个例子:
class AddressSegment(AutoEnum):
misc = "not currently tracked"
ordinal = "N S E W NE NW SE SW"
secondary = "apt bldg floor etc"
street = "st ave blvd etc"
您可能会问为什么我"N S E W NE NW SE SW"
的价值不仅仅是ordinal
?因为当我得到它的repr看到<AddressSegment.ordinal: 'N S E W NE NW SE SW'>
变得有点笨拙,但在文档字符串中随时可用的信息是一个很好的妥协。
以下是Enum的配方:
class AutoEnum(enum.Enum):
"""
Automatically numbers enum members starting from 1.
Includes support for a custom docstring per member.
"""
__last_number__ = 0
def __new__(cls, *args):
"""Ignores arguments (will be handled in __init__."""
value = cls.__last_number__ + 1
cls.__last_number__ = value
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, *args):
"""Can handle 0 or 1 argument; more requires a custom __init__.
0 = auto-number w/o docstring
1 = auto-number w/ docstring
2+ = needs custom __init__
"""
if len(args) == 1 and isinstance(args[0], (str, unicode)):
self.__doc__ = args[0]
elif args:
raise TypeError('%s not dealt with -- need custom __init__' % (args,))
我处理__init__
而不是__new__
中的参数的原因是,如果我想进一步扩展它,可以使子类化AutoEnum
更容易。
答案 1 :(得分:-1)
函数和类具有文档字符串,但是大多数对象都没有,甚至根本不需要它们。实例属性没有本机docstring语法,因为可以在类的docstring中详尽地描述它们,这也是我建议您做的。通常,类的实例也没有自己的文档字符串,枚举成员仅此而已。
当然,您可以在几乎所有内容中添加文档字符串。实际上,实际上,您可以在几乎所有内容中添加任何内容,因为这是python的设计方式。但这既没有用处,也不干净,甚至@Ethan Furman发表的内容似乎只是为了将文档字符串添加到静态属性而导致大量开销的方法。
长话短说,即使您一开始可能不喜欢它: 只是不要这样做,而是使用枚举的文档字符串。足以解释其成员的含义。