@ user2340939 Isso retorna a lista de enumerações, não a lista de valores. Se você está bem com isso, você também pode usarlist(Color)
endólito
1
Isso deve ser marcado como a resposta correta.
SKYFALL26
22
Para usar o Enum com qualquer tipo de valor, tente o seguinte:
Atualizado com algumas melhorias ... Obrigado @ Jeff, pela sua dica!
from enum importEnumclassColor(Enum):
RED =1
GREEN ='GREEN'
BLUE =('blue','#0000ff')@staticmethoddef list():return list(map(lambda c: c.value,Color))print(Color.list())
class enum.Enumé uma classe que resolve todas as suas necessidades de enumeração; portanto, você só precisa herdar dela e adicionar seus próprios campos. A partir de então, tudo o que você precisa fazer é chamar seus atributos: name& value:
from enum importEnumclassLetter(Enum):
A =1
B =2
C =3print({i.name: i.value for i inLetter})# prints {'A': 1, 'B': 2, 'C': 3}
Então o Enumtem um __members__ditado. A solução que o @ozgur propôs é realmente a melhor, mas você pode fazer isso, o que faz a mesma coisa, com mais trabalho
[color.value for color_name, color in Color.__members__.items()]
O __members__dicionário pode ser útil se você quiser inserir coisas dinamicamente nele ... em alguma situação maluca.
[EDIT]
Aparentemente, __members__não é um dicionário, mas um proxy de mapa. O que significa que você não pode adicionar itens facilmente a ele.
No entanto, você pode fazer coisas estranhas como MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', e então você pode usar a nova chave como MyEnum.new_key.... mas isso é apenas um detalhe de implementação e não deve ser jogado com. A magia negra é paga com enormes custos de manutenção.
Apenas uma barra lateral: os itens podem ser adicionados __members__? Seria uma maneira interessante de permitir extensões , criando novos Enummembros. ... btw, votado por trazer um novo atributo ( para mim ) para a tabela.
IAbstract
@IAbstract: Não, isso não é permitido. Se alguém descobrir uma maneira de adicionar / subtrair membros após a criação do Enum, provavelmente quebrará esse Enum.
Ethan Furman
@IAbstract: Adicione novos membros depois que o fato geralmente não é uma boa ideia. Se você realmente quiser, confira esta resposta .
Ethan Furman
1
Use _member_names_para obter um resultado fácil e rápido se forem apenas os nomes, ou seja,
Color._member_names_
Além disso, você possui o _member_map_que retorna um dicionário ordenado dos elementos. Esta função retorna a collections.OrderedDict, então você tem Color._member_names_.items()e Color._member_names_.values()para brincar. Por exemplo
a = [(int(v), str(v)) for v in Color]
e entãoprint(a)
.[(color.value, color.name) for color in Color]
Você pode fazer o seguinte:
fonte
list(Color)
Para usar o Enum com qualquer tipo de valor, tente o seguinte:
Atualizado com algumas melhorias ... Obrigado @ Jeff, pela sua dica!
Como resultado:
fonte
@classmethod
seria necessário criar uma instância deColor
classe. É por isso questaticmethod
parece ser a escolha correta aqui.@classmethod
e usarreturn list(map(lambda c: c.value, cls))
.Com base na resposta de @Jeff, refatorado para usar a
classmethod
para que você possa reutilizar o mesmo código para qualquer uma de suas enumerações:Produz:
fonte
class
enum.Enum
é uma classe que resolve todas as suas necessidades de enumeração; portanto, você só precisa herdar dela e adicionar seus próprios campos. A partir de então, tudo o que você precisa fazer é chamar seus atributos:name
&value
:fonte
Então o
Enum
tem um__members__
ditado. A solução que o @ozgur propôs é realmente a melhor, mas você pode fazer isso, o que faz a mesma coisa, com mais trabalho[color.value for color_name, color in Color.__members__.items()]
O
__members__
dicionário pode ser útil se você quiser inserir coisas dinamicamente nele ... em alguma situação maluca.[EDIT] Aparentemente,
__members__
não é um dicionário, mas um proxy de mapa. O que significa que você não pode adicionar itens facilmente a ele.No entanto, você pode fazer coisas estranhas como
MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, e então você pode usar a nova chave comoMyEnum.new_key
.... mas isso é apenas um detalhe de implementação e não deve ser jogado com. A magia negra é paga com enormes custos de manutenção.fonte
__members__
? Seria uma maneira interessante de permitir extensões , criando novosEnum
membros. ... btw, votado por trazer um novo atributo ( para mim ) para a tabela.Use
_member_names_
para obter um resultado fácil e rápido se forem apenas os nomes, ou seja,Além disso, você possui o
_member_map_
que retorna um dicionário ordenado dos elementos. Esta função retorna acollections.OrderedDict
, então você temColor._member_names_.items()
eColor._member_names_.values()
para brincar. Por exemploretornará todos os valores válidos de Color
fonte
você pode usar a função iter ():
fonte