我想将字符串解析为python枚举.通常会实现一个解析方法来执行此操作.几天前,我发现了__new__方法,该方法能够根据给定的参数返回不同的实例.
这是我的代码,它不起作用:
import enum
class Types(enum.Enum):
Unknown = 0
Source = 1
NetList = 2
def __new__(cls, value):
if (value == "src"): return Types.Source
# elif (value == "nl"): return Types.NetList
# else: raise Exception()
def __str__(self):
if (self == Types.Unknown): return "??"
elif (self == Types.Source): return "src"
elif (self == Types.NetList): return "nl"
Run Code Online (Sandbox Code Playgroud)
当我执行我的Python脚本时,我收到以下消息:
[...]
class Types(enum.Enum):
File "C:\Program Files\Python\Python 3.4.0\lib\enum.py", line 154, in __new__
enum_member._value_ = member_type(*args)
TypeError: object() takes no parameters
Run Code Online (Sandbox Code Playgroud)
如何返回枚举值的正确实例?
此枚举用于URI解析,特别是用于解析架构.所以我的URI看起来像这样 …
在本文中, Nick Coghlan讨论了PEP 435 Enum类型的一些设计决策,以及如何EnumMeta进行子类化以提供不同的Enum体验。
但是,我给出的建议(我是stdlib的主要Enum作者)关于使用元类的建议是,在没有充分好的理由的情况下不应该这样做-例如,无法使用类装饰器或专用工具来完成所需的工作隐藏任何丑陋的功能;而在我自己的工作,我已经能够做到我需要什么简单的使用__new__,__init__在创建时,和/或正常类/实例方法Enum类:
然后是一个警告性的故事,在研究Enum,有和没有元类子类化时要小心:
考虑到所有这些,我什么时候需要摆弄EnumMeta自己?
我想扩展 Python 枚举以支持未定义的值。
我的用例:我想从 Enums 中受益(例如,能够用说话的名字来寻址/比较已知条目),但我也希望它支持未知值。如果值后面没有名称, str 应该简单地打印值的 str 表示并且比较应该失败。
让我给你一个简短的例子,我想要什么:
from enum import Enum
class Foo(Enum):
A = 1
B = 2
C = 3
def __str__(self):
return self.name
print(Foo(1)) # prints 'A'
print(Foo(2)) # print 'B'
print(Foo(3)) # prints 'C'
print(Foo(1) == Foo.A) # prints 'true'
print(Foo(4)) # I'd expect '4'
print(Foo(123)) # I'd expect '123'
print(Foo(123) == Foo.A) # I'd expect False
Run Code Online (Sandbox Code Playgroud)
当然,最后几行失败了。
有没有办法扩展枚举,或者是否有另一种简单的 Pythonic 方法?(请不要使用第三方库。)