Como Enums em Python melhoram a legibilidade do código

Enums são um tipo de dados popular em linguagens de programação como C, C++ e Java. Eles ajudam você a escrever código com segurança de digitação e mais legível.

Em Python, enums nem sempre eram suportados. No entanto, desde a versão 3.4, o Python agora oferece suporte a enums. Este artigo é um guia sobre como criar enums, como usá-los e como eles melhoram a legibilidade do código.

O que são Enums e o que eles fazem?

Uma enumeração ou enumeração é um tipo de dados definido pelo conjunto de valores que pode assumir. Este conjunto de valores é referido como seu conjunto de membros. Enums permitem definir os valores que uma variável poderia ter de forma mais restrita. Isso ajuda você a escrever código com segurança de tipo. Também melhora a legibilidade.

Alguns termos para saber

À medida que discutimos enums, há termos que devo definir primeiro, pois os usaremos muito. Estes são membros e valores.

  • Membros: Estas são as constantes nomeadas que formam o conjunto de valores que pertencem ao enum. Por exemplo, a enumeração Dias pode conter os seguintes membros: Domingo, Segunda-feira, Terça-feira, etc.
  • Valores: estes são os valores usados ​​internamente para representar cada membro da enumeração de forma distinta. Isso tornará possível fazer comparações. Por exemplo, na enumeração Dias, domingo pode ter o valor 0, segunda-feira o valor 1, terça-feira o valor 2 etc.

Agora, discutiremos como Enums melhoram seu código.

Como Enums melhoram seu código

Enums melhoram seu código e o tornam mais legível e menos sujeito a erros. Abaixo estão alguns dos motivos pelos quais você deve usá-los:

  • Enums permitem que você defina claramente quais valores um argumento de variável ou função espera. Deixar claras suas intenções com um argumento de variável ou função permite que as pessoas entendam seu código com facilidade.
  • Enums também tornam seu código autodocumentado. Isso significa que você não precisa adicionar comentários ou documentos para especificar quais valores uma função espera. Em vez disso, seu enum especifica quais valores são esperados.
  • Isso também permite que os IDEs destaquem erros quando você passa valores incorretos e forneçam suporte ao preenchimento automático.
  • Como resultado, seu código se torna seguro e menos propenso a produzir erros de tempo de execução.
  6 cursos de desenho online para se tornar um artista

A seguir, discutiremos como criar Enums em Python.

Como criar enumerações em Python

Python não possui suporte nativo para enums. Mas fornece um módulo enums na biblioteca padrão. Usaremos esse módulo neste tutorial. Existem também dois métodos para criar enums em Python: Classes ou a API Function. Abordarei ambos nesta seção.

Pré-requisitos

Para seguir este tutorial, você precisará do Python 3.4 instalado. Esta versão do Python vem com o módulo enum na biblioteca padrão. Se você ainda não fez isso, aqui está um tutorial para ajudá-lo:

Para seguir o tutorial, você precisará conhecer um pouco de Python. Isso inclui Python básico e conceitos mais avançados de programação orientada a objetos, como classes e herança.

#1. O Método de Classe

O primeiro método para criar enums é usar classes. Primeiro você importa a classe enum do módulo enum. Em seguida, você cria seu enum criando uma classe. Esta classe herdará da classe Enum que você importou anteriormente.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 1
    SOUTH = 2
    WEST = 3

Você também pode atribuir quaisquer valores desejados aos membros de uma enumeração. Aqui está um exemplo: em vez de atribuir 0, 1, 2 e 3 à nossa enumeração de direções, atribuímos seus valores de rumo correspondentes de 0, 90, 180 e 270.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 90
    SOUTH = 180
    WEST = 270

Alternativamente, usar a função range é uma maneira mais concisa de gerar o que foi dito acima. O trecho de código abaixo demonstra como:

from enum import Enum

class Direction(Enum):
    NORTH, EAST, SOUTH, WEST = range(0, 360, 90)

Neste caso, geramos valores usando a função range. Especificamos 0 como nosso valor inicial, 360 como nosso valor final e 90 como valor incremental. Desestruturamos os valores do iterável, semelhante à forma como desestruturamos as tuplas. Se você quiser ler mais sobre desestruturação de tuplas, aqui está um artigo sobre tuplas em Python.

  Como aumentar e diminuir o zoom em um Chromebook (5 maneiras)

Classes Enum são classes abstratas. Isso significa que eles não devem ser instanciados. Em vez disso, suas propriedades, que neste caso representam os membros do enum, são acessadas diretamente.

#2. O Método da Função

O método de função é uma alternativa ao método de subclasse.

from enum import Enum

Direction = Enum("Direction", ["NORTH", "EAST", "SOUTH", "WEST"])

No trecho de código acima, criamos uma enumeração chamada Direction. É acessível usando quatro membros, que fornecemos como segundo argumento. Por padrão, esses membros recebem valores de 1. Portanto, Norte é 1, Leste é 2 e assim por diante. Este é o caso e não um índice baseado em zero como o esperado porque 0 é falso. Portanto, para tornar todos os valores verdadeiros, os valores são numerados a partir de 1.

Alternativamente, você pode atribuir valores aos seus membros passando os membros como uma lista de tuplas. Cada tupla compreende dois elementos: o nome do membro e o valor desse membro.

from enum import Enum

Direction = Enum(
    name = "Direction",
    values = [
        ("NORTH", "n"),
        ("EAST", "e"),
        ("SOUTH", "s"),
        ("WEST", "w"),
    ]
)

Você também notará que usei strings em vez de números inteiros ao atribuir valores aos membros no exemplo acima. Isso demonstra que strings são tão válidas quanto números inteiros ao atribuir valores.

Como usar enumerações

Na seção anterior, abordamos a criação de enums e a atribuição de valores aos membros. Esta seção abordará o uso de enums para acessar e atribuir membros e verificar a igualdade.

  Como editar e formatar um Google Doc com comandos de voz

Como acessar membros

Existem vários métodos para acessar membros de uma enumeração. Isso inclui a sintaxe de ponto, parênteses e sintaxe de colchetes. Aqui está um exemplo para demonstrar o acima:

from enum import Enum

# Creating an enum
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Accessing enum members
# 1. Using dot syntax
print(Day.SUNDAY)

# 2. Using square brackets
print(Day["MONDAY"])

# 3. Using the parentheses
print(Day(3))

Depois de acessar um membro enum, você pode armazená-lo em uma variável. Observe que acessar um membro fornece uma referência ao objeto membro, não seu valor ou nome. É importante lembrar disso nas próximas seções.

Acessando o nome e o valor

Conforme mencionado anteriormente, ao acessar um membro enum, você cria uma referência ao objeto membro. Se você quiser, por algum motivo, acessar o nome ou o valor do objeto enum, poderá usar as propriedades name e value no objeto.

print(Day.SUNDAY.name, Day.SUNDAY.value)

Verificando a igualdade

Lembre-se de que atribuir um membro enum a uma variável cria uma referência ao objeto membro enum. Portanto, para verificar se uma variável possui um membro enum específico, usamos o operador is para verificar se o membro enum e a variável apontam para o mesmo objeto.

Aqui está um exemplo para demonstrar:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("It's a Monday, :(")

if today is Day.WEDNESDAY:
    print("Happy Wednesday")

Alternativamente, você pode usar o operador ==. Nas superclasses da classe Enum, o operador == é um wrapper para o operador is. Isso é feito usando sobrecarga do operador. Você pode ler mais sobre isso neste artigo sobre Métodos Mágicos. De qualquer forma, aqui está um exemplo que usa == em vez de is.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("It's a Monday, :(")

if today == Day.WEDNESDAY:
    print("Happy Wednesday")

Correndo o risco de serem repetitivas, as comparações de enum verificam a identidade do objeto, não os valores.

Palavras Finais

Este artigo abordou o que são enums e por que são úteis. Também cobrimos os diferentes métodos para criar enums subclassificando a classe Enum e usando a API funcional.

Além disso, abordamos como usar enums, acessar valores e fazer comparações. A seguir, você pode querer ler nosso artigo sobre enums TypeScript.