Zephyrnet Logo

Python Enum: como construir enumerações em Python – KDnuggets

Data:

Python Enum: como construir enumerações em Python
Imagem do autor
 

Se você programou em uma linguagem como C++ ou Java, provavelmente usou enums para criar constantes nomeadas. Enums são úteis quando você tem uma variável que assume um número fixo de valores - geralmente relacionados, como dias da semana, notas dos alunos, status do pedido e assim por diante.

Python, entretanto, não possui um tipo de dados enum explícito. Mas você pode usar o módulo enum na biblioteca padrão do Python para criar enumerações. E este tutorial vai te ensinar como. 

Vamos começar!

Enum significa “enumeração” e consiste em um conjunto de constantes nomeadas predefinidas. Essas constantes geralmente estão relacionadas. Exemplos comuns incluem meses de um ano, dias da semana, notas, pedidos e status de tarefas. 

Resumindo: um enum é essencialmente uma coleção de constantes relacionadas, onde cada constante possui um nome significativo associado a ela.

Em Python, você pode criar enums usando o módulo enum (o que faremos em breve!).

Por que usar enumerações

O uso de enums ajuda a melhorar a clareza e a capacidade de manutenção do código. Veja como: 

  • As enums melhoram a clareza do código, substituindo números mágicos ou strings por rótulos significativos. Eles também tornam o código mais autodocumentado, pois os nomes dos membros do enum transmitem sua finalidade. 
  • As enumerações melhoram a capacidade de manutenção do código, fornecendo uma maneira simples de definir e gerenciar constantes relacionadas. 
  • Ao restringir as atribuições de variáveis ​​apenas a valores enum válidos, os enums também garantem a segurança do tipo. 
  • Enums facilitam a iteração e comparação de constantes relacionadas.

Agora vamos criar nossa primeira enumeração em Python.

vamos criar um TaskStatus enum que leva os quatro nomes e valores a seguir:

 

Python Enum: como construir enumerações em Python
Imagem do autor
 

Primeiro, importamos o Enum class do módulo enum para criar enums. 

Definimos então uma nova classe TaskStatus que herda de Enum para criar uma enumeração. Cada membro é definido com um nome exclusivo e um valor opcional como este:

from enum import Enum
	 
class TaskStatus(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Todos os membros enum que criamos são instâncias da classe Enum. Você pode verificar isso ligando para o isinstance() funcionar como mostrado:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

Vamos imprimir todos os membros do TaskStatus enum lançando-o em uma lista:

print(list(TaskStatus))

 

Você deve ver a seguinte saída:

Output >>>

[<TaskStatus.TODO: 0>, <TaskStatus.IN_PROGRESS: 1>, <TaskStatus.DONE: 2>, <TaskStatus.ABANDONED: -1>]

 

Todos os membros do enum têm um nome e de um valor. O que significa que você pode acessar membros do enum usando seus nomes, como TaskStatus.TODO. Ou você os acessa por valor, como TaskStatus(0).

Agora que criamos um simples TaskStatus enum, vamos aprender como executar tarefas simples, como iterar os membros do enum.

Iterando sobre Enums

Em Python, você pode trabalhar com enums praticamente da mesma forma que trabalha com qualquer iterável. Por exemplo, você pode usar o len() função para contar o número de membros enum:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

Você também pode iterar sobre enums da mesma forma que faria com um iterável Python, como list. No loop for a seguir, acessamos o nome e o valor de cada membro enum e os imprimimos:

for status in TaskStatus:
    print(status.name, status.value)

 

Aqui está o resultado:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Ordenação em Enums

No exemplo, o status e o valor numérico correspondente são os seguintes:

  • FAZER: 0
  • EM_PROGRESSO: 1
  • FEITO: 2
  • ABANDONADO: -1

Mas você também pode usar a ordem padrão usando o comando auto() função auxiliar. Ao fazer isso, se você tiver 'n' membros na enumeração, os valores atribuídos serão de 1 a n. Mas você pode passar um valor inicial, digamos k, auto(k) para a enumeração começar em k e ir até k + n.

Vamos modificar o TaskStatus enum conforme mostrado:

from enum import Enum, auto

class TaskStatus(Enum):
    TODO = auto()
    IN_PROGRESS = auto()
    DONE = auto()
    ABANDONED = auto()

 

Agora vamos imprimir os membros:

print(list(TaskStatus))

 

Vemos que os valores são de 1 a 4 conforme esperado:

Output >>>

[<TaskStatus.TODO: 1>, <TaskStatus.IN_PROGRESS: 2>, <TaskStatus.DONE: 3>, <TaskStatus.ABANDONED: 4>]

Agora vamos construir sobre o TaskStatus enum que temos. Crie um arquivo task.py em seu diretório de trabalho com a seguinte versão do enum:

# task.py

from enum import Enum

class TaskState(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Digamos que temos uma tarefa com um nome e um status atual. E as transições válidas entre estados são mostradas:

 

Python Enum: como construir enumerações em Python
Imagem do autor
 

Vamos criar um Task classe:

class Task:
    def __init__(self, name, state):
        self.name = name
        self.state = state
    
    def update_state(self, new_state):
        # Define valid state transitions based on the current state
        valid_transitions = {
        	TaskState.TODO: [TaskState.IN_PROGRESS, TaskState.ABANDONED],
        	TaskState.IN_PROGRESS: [TaskState.DONE, TaskState.ABANDONED],
        	TaskState.DONE: [],
        	TaskState.ABANDONED: []
    	}
   	 
        # Check if the new state is a valid transition from the current state
        if new_state in valid_transitions[self.state]:
            self.state = new_state
        else:
            raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")

 

Temos um update_status() método que verifica se a transição para o novo estado é válida dado o status atual. Para transições inválidas, uma exceção ValueError é gerada.

Aqui está um exemplo do Task class: a tarefa “Escrever Relatório” com status TODO:

# Create a new task with the initial state "To Do"
task = Task("Write Report", TaskState.TODO)

# Print the task details
print(f"Task Name: {task.name}")
print(f"Current State: {task.state.name}")

 

Output >>>
Task Name: Write Report
Current State: TODO

 

Atualizar o status da tarefa para IN_PROGRESS deve funcionar, pois é uma transição de estado válida:

# Update the task state to "In Progress"
task.update_state(TaskState.IN_PROGRESS)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: IN_PROGRESS

 

E assim que a tarefa for concluída, podemos atualizar seu status para CONCLUÍDO:

# Update the task state to "DONE"
task.update_state(TaskState.DONE)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: DONE

 

Mas se você tentar atualizar o status para um inválido, como tentar atualizar DONE para TODO, você encontrará a exceção ValueError:

# Attempt to update the task state to an invalid state
task.update_state(TaskState.TODO)

 

Aqui está o rastreamento do ValueError gerado devido à transição de estado inválida de DONE para TODO:

Traceback (most recent call last):
  File "/home/balapriya/enums/task.py", line 46, in 
	task.update_state(TaskState.TODO)
  File "/home/balapriya/enums/task.py", line 30, in update_state
	raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")
ValueError: Invalid state transition from DONE to TODO

Neste tutorial, aprendemos como construir enumerações em Python codificando uma enumeração TaskStatus simples. Aprendemos como acessar membros enum e iterar sobre eles. 

Além disso, aprendemos como funciona a ordem padrão se você optar por usar o auto() função auxiliar para definir os valores para membros enum. Em seguida, tentamos usar o enum TaskStatus em um exemplo mais útil. 

Você pode encontrar o exemplos de código no GitHub. Vejo vocês em breve em outro tutorial de Python. Até então, boa codificação!
 
 

Bala Priya C é um desenvolvedor e escritor técnico da Índia. Ela gosta de trabalhar na interseção de matemática, programação, ciência de dados e criação de conteúdo. Suas áreas de interesse e especialização incluem DevOps, ciência de dados e processamento de linguagem natural. Ela gosta de ler, escrever, programar e tomar café! Atualmente, ela está trabalhando para aprender e compartilhar seu conhecimento com a comunidade de desenvolvedores criando tutoriais, guias de instruções, artigos de opinião e muito mais.

local_img

Café VC

LifeSciVC

Inteligência mais recente

Café VC

LifeSciVC

local_img