Resumo : neste tutorial, você aprenderá sobre a enumeração do Python e como usá-la de maneira eficaz.
Introdução à enumeração Python
Por definição, uma enumeração é um conjunto de membros que possuem valores constantes exclusivos associados. A enumeração costuma ser chamada de enum.
Python fornece o enum
módulo que contém o Enum
tipo para definir novas enumerações. E você define um novo tipo de enumeração criando uma subclasse da Enum
classe.
O exemplo a seguir mostra como criar uma enumeração chamada Color
:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe o Enum
tipo do enum
módulo:
from enum import Enum
Linguagem de código: Python ( python )
Segundo, defina a Color
classe que herda do Enum
tipo:
class Color(Enum):
Linguagem de código: Python ( python )
Terceiro, defina os membros da Color
enumeração:
RED = 1
GREEN = 2
BLUE = 3
Linguagem de código: Python ( python )
Observe que os membros da enumeração são constantes. Portanto, seus nomes estão em letras maiúsculas por convenção.
Neste exemplo, the Color
é uma enumeração. Os RED
, GREEN
e BLUE
são membros da Color
enumeração. Eles têm valores associados 1, 2 e 3.
O tipo de um membro é a enumeração à qual ele pertence.
O seguinte ilustra que o tipo de Color.RED
é a Color
enumeração:
print(type(Color.RED))
Linguagem de código: Python ( python )
Saída:
<enum 'Color'>
Linguagem de código: Python ( python )
O Color.RED
também é uma instância da Color
enumeração:
print(isinstance(Color.RED, Color))
Linguagem de código: Python ( python )
Saída:
True
Linguagem de código: Python ( python )
E tem os atributos de nome e valor:
print(Color.RED.name)
print(Color.RED.value)
Linguagem de código: Python ( python )
Saída:
RED
1
Linguagem de código: Python ( python )
Associação e igualdade
Para verificar se um membro está em uma enumeração, você usa o in
operador. Por exemplo:
if Color.RED in Color:
print('Yes')
Linguagem de código: Python ( python )
Saída:
Yes
Linguagem de código: Python ( python )
Para comparar dois membros, você pode usar o operador is
ou ==
. Por exemplo:
if Color.RED is Color.BLUE:
print('red is blue')
else:
print('red is not blue')
Linguagem de código: Python ( python )
Saída:
red is not blue
Linguagem de código: Python ( python )
Observe que um membro e seu valor associado não são iguais. O exemplo a seguir retorna False
:
if Color.RED == 1:
print('Color.RED == 1')
else:
print('Color.RED != 1')
Linguagem de código: Python ( python )
Saída:
Color.RED != 1
Linguagem de código: Python ( python )
Os membros da enumeração são hashable
Os membros da enumeração são sempre hashable . Isso significa que você pode usar os membros da enumeração como chaves em um dicionário ou como elementos de um Set .
O exemplo a seguir usa os membros da Color
enumeração em um dicionário:
rgb = {
Color.RED: '#ff0000',
Color.GREEN: '#00ff00',
Color.BLUE: '#0000ff'
}
Linguagem de código: Python ( python )
Acesse um membro de enumeração por nome e valor
A maneira típica de acessar um membro de enumeração é usar a sintaxe de notação de ponto (.) como você viu até agora:
Color.RED
Linguagem de código: Python ( python )
Como Enum
implementa o __getitem__
método, você também pode usar uma sintaxe de colchetes []
para obter um membro pelo seu nome.
Por exemplo, o seguinte usa a sintaxe de colchetes []
para obter o RED
membro da Color
enumeração por seu nome:
print(Color['RED'])
Linguagem de código: Python ( python )
Saída:
Color.RED
Linguagem de código: Python ( python )
Como uma enumeração pode ser chamada , você pode obter um membro pelo seu valor. Por exemplo, o seguinte retorna o RED
membro da Color
enumeração por seu valor:
print(Color(1))
Linguagem de código: Python ( python )
Saída:
Color.RED
Linguagem de código: Python ( python )
A expressão a seguir é retornada True
porque acessa o mesmo membro de enumeração usando nome e valor:
print(Color['RED'] == Color(1))
Linguagem de código: Python ( python )
Saída:
True
Linguagem de código: Python ( python )
Iterar membros da enumeração
As enumerações são iteráveis, portanto você pode iterá-las usando um for
loop. Por exemplo:
for color in Color:
print(color)
Linguagem de código: Python ( python )
Saída:
Color.RED
Color.GREEN
Color.BLUE
Linguagem de código: Python ( python )
Observe que a ordem dos membros é a mesma da definição de enumeração.
Além disso, você pode usar a list()
função para retornar uma lista de membros de uma enumeração:
print(list(Color))
Linguagem de código: Python ( python )
Saída:
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
Linguagem de código: Python ( python )
As enumerações são imutáveis
As enumerações são imutáveis . Isso significa que você não pode adicionar ou remover membros depois que uma enumeração for definida. E você também não pode alterar os valores dos membros.
O exemplo a seguir tenta atribuir um novo membro à Color
enumeração e causa um TypeError
:
Color['YELLOW'] = 4
Linguagem de código: Python ( python )
Erro:
TypeError: 'EnumMeta' object does not support item assignment
Linguagem de código: Python ( python )
O exemplo a seguir tenta alterar o valor do RED
membro da Color
enumeração e causa um AttributeError
:
Color.RED.value = 100
Linguagem de código: Python ( python )
Saída:
AttributeError: can't set attribute
Linguagem de código: Python ( python )
Herda de uma enumeração
Uma enumeração não pode ser herdada a menos que não contenha membros. O exemplo a seguir funciona bem porque a Color
enumeração não contém membros:
class Color(Enum):
pass
class RGB(Color):
RED = 1
GREEN = 2
BLUE = 3
Linguagem de código: Python ( python )
No entanto, o exemplo a seguir não funcionará porque a RGB
enumeração possui membros:
class RGBA(RGB):
ALPHA = 4
Linguagem de código: Python ( python )
Erro:
TypeError: Cannot extend enumerations
Linguagem de código: Python ( python )
Exemplo de enumeração Python
O exemplo a seguir define uma enumeração chamada ResponseStatus
:
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
Linguagem de código: Python ( python )
Suponha que você receba uma resposta de uma solicitação HTTP com a seguinte string:
response = '''{
"status":"fulfilled"
}'''
Linguagem de código: Python ( python )
E você deseja procurar a ResponseStatus
enumeração pelo status
. Para fazer isso, você precisa converter a string da resposta em um dicionário e obter o valor do status:
import json
data = json.loads(response)
status = data['status']
Linguagem de código: Python ( python )
E então você procura o membro da ResponseStatus
enumeração pelo valor do status:
print(ResponseStatus(status))
Linguagem de código: Python ( python )
Saída:
PromiseStatus.FULFILLED
Linguagem de código: Python ( python )
Aqui está o programa completo:
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"fulfilled"
}'''
data = json.loads(response)
status = data['status']
print(ResponseStatus(status))
Linguagem de código: Python ( python )
E se status
não for um dos valores dos ResponseStatus
membros? então você receberá um erro. Por exemplo:
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"ok"
}'''
data = json.loads(response)
status = data['status']
print(ResponseStatus(status))
Linguagem de código: Python ( python )
Erro:
ValueError: 'ok' is not a valid ResponseStatus
Linguagem de código: Python ( python )
Para capturar a exceção, você pode usar a instrução try…except como a seguir:
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"ok"
}'''
data = json.loads(response)
status = data['status']
try:
if ResponseStatus(status) is ResponseStatus.FULFILLED:
print('The request completed successfully')
except ValueError as error:
print(error)
Linguagem de código: Python ( python )
Resumo
- Uma enumeração é um conjunto de membros que possuem valores constantes exclusivos associados.
- Crie uma nova enumeração definindo uma classe que herda do
Enum
tipo do módulo enum. - Os membros têm os mesmos tipos da enumeração à qual pertencem.
- Use
enumeration[member_name]
para acessar um membro pelo seu nome eenumeration(member_value)
para acessar um membro pelo seu valor. - As enumerações são iteráveis .
- Os membros da enumeração são hashable .
- Enumeráveis são imuáveis.
- Não é possível herdar de uma enumeração, a menos que ela não tenha membros.