gpt4 book ai didi

python-2.7 - 如何将文档字符串放在 Enums 上?

转载 作者:行者123 更新时间:2023-12-04 01:10:31 25 4
gpt4 key购买 nike

Python 3.4 有一个新的 enum 模块和 Enum 数据类型。如果您还不能切换到 3.4,Enum has been backported .

由于枚举成员支持文档字符串,就像几乎所有 python 对象一样,我想设置它们。有没有简单的方法可以做到这一点?

最佳答案

是的,这是迄今为止我最喜欢的食谱。作为奖励,也不必指定整数值。这是一个例子:

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 的值?因为当我看到它的代表时 <AddressSegment.ordinal: 'N S E W NE NW SE SW'>有点笨拙,但是在文档字符串中随时提供这些信息是一个很好的折衷方案。

这是枚举的配方:
class AutoEnum(enum.Enum):
"""
Automatically numbers enum members starting from 1.

Includes support for a custom docstring per member.
"""
#
def __new__(cls, *args):
"""Ignores arguments (will be handled in __init__."""
value = len(cls) + 1
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,))

并在使用中:
>>> list(AddressSegment)
[<AddressSegment.ordinal: 1>, <AddressSegment.secondary: 2>, <AddressSegment.misc: 3>, <AddressSegment.street: 4>]

>>> AddressSegment.secondary
<AddressSegment.secondary: 2>

>>> AddressSegment.secondary.__doc__
'apt bldg floor etc'

我处理 __init__ 中的论点的原因而不是在 __new__是进行子类化 AutoEnum如果我想进一步扩展它更容易。

关于python-2.7 - 如何将文档字符串放在 Enums 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19330460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com