Future-compatible enums in 2.7?
许多实现枚举的方法都显示在这个问题的答案中。 但是,PEP0435现在已经出版,并描述了Enum和IntEnum将如何在Python 3.4中成为官方。
我的问题不是关于在Python中模拟枚举的特定方法的优点/缺点。 相反,对于我们这些仍然停留在2.X版本中的人来说,我希望得到关于最具前瞻性的兼容方式的建议。
flufl.enum最初将成为参考实现,但由于成员不是该类型的实例(并允许同时具有附加成员的子类)而被删除。 后者不会对日常生活造成太大影响,但前者可能会引发更多问题?
那里有没有类似于添加到3.4并与2.7+兼容的库?
-
这不是问题。发布"官方"枚举时,使用手动枚举不会破坏。另外,不要使用枚举。这不是C.
-
3.4实现依赖于元类上的新__prepare__函数,因此将其移植回2.7将是一个挑战,但是仍然可以使用后端口。最好坚持手卷;他们将继续工作,但不完全具备官方模块的所有好处。
-
@JoachimSauer随着语言的发展,越来越多的人不愿意适应,因此C语言结构的选区也在增长。
-
@Marcin:"不要使用枚举"。也许你可以证明你的观点是正确的,而不是"这不是C"的广告。你的论点的基础是什么,枚举类型不应该存在于Python(也许在所有其他语言中)?渴望学习,谢谢。
-
@jarmod那不是广告。也许你可以在转换之前使用它们来学习短语的含义。存在枚举以允许将名称模糊地类型安全地分配给C中的数字。鉴于python变量是无类型的,并且用户可以创建它们自己的类型,因此不需要这样的功能。
-
@jarmod请注意,枚举的主要用途之一(如果不是唯一用途)是在switch / case语句中选择case,而python也缺少。
-
@Marcin感谢您的信息。枚举的另一个用途是将对象持久保存到磁盘,或通过网络发送到另一个系统 - 例如,您可能需要一个扑克牌套装(球杆,心形,钻石,黑桃)的线材表示。
-
@jarmod这真的不是整数所不能做到的。同样,如果你想要,你的类应该能够将自己序列化为整数。再次,使用XML和JSON解决了在除最专业的应用程序之外的所有应用程序中创建有线格式的需求,这不是太紧迫。
-
我对Python中的枚举持怀疑态度......然而,Guido祝福PEP435的事实非常令人信服,PEP本身就有充分的理由。我也来到这里寻找Py2.7的PEP435枚举的兼容实现......
-
@Marcin,enums(顾名思义)是一个枚举。在Python中,我甚至不希望它们是数字。他们的观点是指定一个有限的集合。例如。一包5个易于记忆的东西。 - 数字既不容易记住(对于非数字相关的东西),也不限于例如5个值。
-
@RobertSiemer如果需要,您可以指定一组对象。鉴于变量是无类型的,具有特定的枚举类型并不会增加太多。
-
@Marcin,让我们聊聊聊天.stackoverflow.com/rooms/6/python好吗?
-
@Marcin chat.stackoverflow.com/transcript/message/22165077#22165077
-
变量是无类型的,但对象是键入的。枚举值确实是键入的。
PPI 435枚举模块的后端在PyPI上可用作enum34。 后端似乎是非官方的,但它是由Ethan Furman撰写的,他是Python核心提交者,也是PEP 435的共同作者之一。
声明的backport与Python 2.4及更高版本兼容。 当然,在Python 2中,行为存在一些相对较小的差异,但从我在Pyhon 2.7下的初步探索中,我会说前向兼容性水平相当高。
根据您的使用情况,您可以使用此库,这也允许模式匹配。