Enumeração Python – 03

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 enummódulo que contém o Enumtipo para definir novas enumerações. E você define um novo tipo de enumeração criando uma subclasse da Enumclasse.

O exemplo a seguir mostra como criar uma enumeração chamada Color:

from enum import Enum


class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3Linguagem de código:  Python  ( python )

Como funciona.

Primeiro, importe o Enumtipo do enummódulo:

from enum import EnumLinguagem de código:  Python  ( python )

Segundo, defina a Colorclasse que herda do Enumtipo:

class Color(Enum):Linguagem de código:  Python  ( python )

Terceiro, defina os membros da Colorenumeração:

RED = 1
GREEN = 2
BLUE = 3Linguagem 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, GREENe BLUEsão membros da Colorenumeraçã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 Colorenumeração:

print(type(Color.RED))Linguagem de código:  Python  ( python )

Saída:

<enum 'Color'>Linguagem de código:  Python  ( python )

O Color.REDtambém é uma instância da Colorenumeração:

print(isinstance(Color.RED, Color))Linguagem de código:  Python  ( python )

Saída:

TrueLinguagem 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
1Linguagem de código:  Python  ( python )

Associação e igualdade

Para verificar se um membro está em uma enumeração, você usa o inoperador. Por exemplo:

if Color.RED in Color:
    print('Yes')Linguagem de código:  Python  ( python )

Saída:

YesLinguagem de código:  Python  ( python )

Para comparar dois membros, você pode usar o operador isou ==. 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 blueLinguagem 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 != 1Linguagem 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 Colorenumeraçã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.REDLinguagem de código:  Python  ( python )

Como Enumimplementa 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 REDmembro da Colorenumeração por seu nome:

print(Color['RED'])Linguagem de código:  Python  ( python )

Saída:

Color.REDLinguagem 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 REDmembro da Colorenumeração por seu valor:

print(Color(1))Linguagem de código:  Python  ( python )

Saída:

Color.REDLinguagem de código:  Python  ( python )

A expressão a seguir é retornada Trueporque acessa o mesmo membro de enumeração usando nome e valor:

print(Color['RED'] == Color(1))Linguagem de código:  Python  ( python )

Saída:

TrueLinguagem de código:  Python  ( python )

Iterar membros da enumeração

As enumerações são iteráveis, portanto você pode iterá-las usando um forloop. Por exemplo:

for color in Color:
    print(color)Linguagem de código:  Python  ( python )

Saída:

Color.RED
Color.GREEN
Color.BLUELinguagem 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 à Colorenumeração e causa um TypeError:

Color['YELLOW'] = 4Linguagem de código:  Python  ( python )

Erro:

TypeError: 'EnumMeta' object does not support item assignmentLinguagem de código:  Python  ( python )

O exemplo a seguir tenta alterar o valor do REDmembro da Colorenumeração e causa um AttributeError:

Color.RED.value = 100Linguagem de código:  Python  ( python )

Saída:

AttributeError: can't set attributeLinguagem 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 Colorenumeração não contém membros:

class Color(Enum):
    pass


class RGB(Color):
    RED = 1
    GREEN = 2
    BLUE = 3Linguagem de código:  Python  ( python )

No entanto, o exemplo a seguir não funcionará porque a RGBenumeração possui membros:

class RGBA(RGB):
    ALPHA = 4Linguagem de código:  Python  ( python )

Erro:

TypeError: Cannot extend enumerationsLinguagem 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 ResponseStatusenumeraçã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 ResponseStatusenumeração pelo valor do status:

print(ResponseStatus(status))Linguagem de código:  Python  ( python )

Saída:

PromiseStatus.FULFILLEDLinguagem 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 statusnão for um dos valores dos ResponseStatusmembros? 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 ResponseStatusLinguagem 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 Enumtipo 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 e enumeration(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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *