这篇文章是为什么Python Enums中的可变值是同一对象的跟进内容。
如果一个
我认为,根据Python的常规惯用法,这是可以接受的,其含义是用户可以使用可变类型作为他们的Enum值,但是需要了解他们可能会遇到的问题。
然而,这引出了第二个问题-由于您可以通过值查找Enum成员,并且该值可以是可变的,因此必须使用除哈希表/ dict之外的其他方法进行查找,因为可变内容不能在这种dict中作为键。
限制Enum值仅为不可变类型以便可以使用dict实现按值查找是否更有效(尽管灵活性较差)?
如果一个
Enum
的值是可变的(例如list
等),那么这些值可以随时更改。我认为,如果按值检索Enum
成员,这会造成一些问题,特别是如果有人无意中更改了他查找的Enum
的值:>>> from enum import Enum
>>> class Color(Enum):
black = [1,2]
blue = [1,2,3]
>>> val_1 = [1,2]
>>> val_2 = [1,2,3]
>>> Color(val_1)
<Color.black: [1, 2]>
>>> Color(val_2)
<Color.blue: [1, 2, 3]>
>>> my_color = Color(val_1)
>>> my_color.value.append(3)
>>> Color(val_2)
<Color.black: [1, 2, 3]>
>>> Color(val_1)
Traceback (most recent call last):
...
ValueError: [1, 2] is not a valid Color
我认为,根据Python的常规惯用法,这是可以接受的,其含义是用户可以使用可变类型作为他们的Enum值,但是需要了解他们可能会遇到的问题。
然而,这引出了第二个问题-由于您可以通过值查找Enum成员,并且该值可以是可变的,因此必须使用除哈希表/ dict之外的其他方法进行查找,因为可变内容不能在这种dict中作为键。
限制Enum值仅为不可变类型以便可以使用dict实现按值查找是否更有效(尽管灵活性较差)?
CODE = [123, "Exit #123"]
)。其中一个退出情况是当用户调用脚本不正确时,您需要显示参数参考。问题在于,引用封装在ArgumentParser
对象中。因此,首先初始化枚举,然后执行多个add_argument()
,然后执行以下操作:ExitCode.HELP.value[1] += '\n' + args.format_help()
。Voilà! - hidefromkgbclass Foo(Enum): NO_REPLY = {'name': 'Team Bar', 'email': 'no-reply@bar.com'} SUPPORT = {'name': 'Team Bar', 'email': 'support@bar.com'}
但我觉得这不太好,所以我改成了这样:class Foo(Enum): NO_REPLY SUPPORT
然后保留一个字典:addresses = {Foo.NO_REPLY: {'name': 'Team Bar', 'email': 'no-reply@bar.com'}, Foo.SUPPORT: {'name': 'Team Bar', 'email': 'support@bar.com'}}
- Vikas Prasadenum
和namedtuple
更加简洁地处理我的用例:Address = namedtuple('Address', ['name', 'email']) class Foo(Enum): NO_REPLY = Address('Team Bar', 'no-reply@bar.com') SUPPORT = Address('Team Bar', 'support@bar.com')
- Vikas Prasad