güncelle: 2017/03/01 Python 3.6 içinde
(ve Aenum 2.0
) Flag
ve IntFlag
sınıfları eklendi; bunun bir parçası bu trivially kolaylaştırır yeni auto()
helper oldu:
>>> class AutoName(Enum):
... def _generate_next_value_(name, start, count, last_values):
... return name
...
>>> class Ordinal(AutoName):
... NORTH = auto()
... SOUTH = auto()
... EAST = auto()
... WEST = auto()
...
>>> list(Ordinal)
[<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]
Orijinal cevap
bir AutoStr
sınıfıyla zorluk enum üyenin adı geçmedi olmasıdır onu oluşturan kod içine, bu nedenle kullanılamaz. Başka bir kırışıklık, str
'un değişmez olmasıdır, bu yüzden oluşturulduktan sonra bu tür enumları değiştiremeyiz (örneğin, bir class decorator kullanarak).bize verdiği
Animal = Enum('Animal', [(a, a) for a in ('horse', 'dog')], type=str)
: yapmak
kolay şey Functional API kullanmaktır
>>> list(Animal)
[<Animal.horse: 'horse'>, <Animal.dog: 'dog'>]
>>> Animal.dog == 'dog'
True
yapılacak sonraki en kolay şey, bir temel sınıf yapmak istiyorum varsayarak Gelecekteki numaralandırma kullanımınız için DocEnem
:
ve kullanımda:
class SpecKind(DocEnum):
REQUIRED = "required value"
OPTION = "single value per name"
MULTI = "multiple values per name (list form)"
FLAG = "boolean value per name"
KEYWORD = 'unknown options'
Not ilk seçenek aksine DocEnum
üye değilstr
ler olduğunu.
da bunu zor yoldan yapmak isterseniz: ile alt sınıfı EnumMeta
ve keman yeni Enum
'ın önce üye oluşturulur sınıf sözlüğü: bize verdiği
from enum import EnumMeta, Enum, _EnumDict
class StrEnumMeta(EnumMeta):
def __new__(metacls, cls, bases, oldclassdict):
"""
Scan through `oldclassdict` and convert any value that is a plain tuple
into a `str` of the name instead
"""
newclassdict = _EnumDict()
for k, v in oldclassdict.items():
if v ==():
v = k
newclassdict[k] = v
return super().__new__(metacls, cls, bases, newclassdict)
class AutoStrEnum(str, Enum, metaclass=StrEnumMeta):
"base class for name=value str enums"
class Animal(AutoStrEnum):
horse =()
dog =()
whale =()
print(Animal.horse)
print(Animal.horse == 'horse')
print(Animal.horse.name, Animal.horse.value)
:
Bildirim: Python stdlib Enum
, enum34
backport ve Advanced Enumeration (aenum
) kitaplığının yazarıyım.
Bunu mu demek istediniz: Animal.dog.value == 'dog''? –
ile ilgili: http://www.acooke.org/cute/Pythonssad0.html – wim
EnumMeta._create_() öğesini enum.py (https://hg.python.org/cpython/file) adresinden değiştirerek yapılabilir. /3.4/Lib/enum.py#l295, ancak kodu korumak için _is_sunder() 'dan gelen adı geçen isimlerde ValueError nedeniyle hemen geçersiz kılınamaz. Ancak, eğer isimler = [' red ',' green ',' blue ' ] ve Renk = Enum ('Renk', adlar = zip (isimler, isimler)), daha sonra Color.red.value == 'red', Color.green.value == 'green' ve Color.blue.value == 'mavi' –