Chame uma classe IntEnum de dentro de um dicionário

Aug 18 2020

Eu tenho um exemplo de classe IntEnum:

class ShapeMethod(IntEnum):
    NONE = 0
    circle = 1
    square = 2

Isso precisa ser chamado pela __init__função de outra classe:

class ExampleClass():
    def __init__(look_at_shapes=None):
        """
        Args:
            look_at_shapes (dict): A dictionary of shape inputs.
        """
        if look_at_shapes:
            self.shape = ShapeMethod.NONE
            if look_at_shapes["colour"]:
                self.colour = look_at_shapes["colour"]

    def do_something_with_shape:
        if self.shape == ShapeMethod.circle:
            print('awesome you got a circle'.)
        elif self.shape == ShapeMethod.square:
            print('squares have 4 sides.')
        else:
            print('nothing to see here.')

onde, o self.shapeatributo precisa ser circle, squareou NONE.

A do_something_with_shapefunção seria então chamada por:

input = {"colour" = blue}
my_object = ExampleClass(look_at_shape=input)
my_object.do_something_with_shape

A estrutura de inputprecisa ser um dicionário e é razoavelmente simples definir o colour. No entanto, não sei como usar corretamente a IntEnumclasse de dentro de um dicionário. Por exemplo, se eu quiser imprimirsquares have 4 sides.

Observação: todas as opções ShapeMethod(IntEnum)precisam ser capitalizadas?


O que eu olhei até agora:

A documentação do Python fornece vários exemplos; entretanto, nenhum se encaixa exatamente no meu caso.

Respostas

4 bad_coder Aug 18 2020 at 00:51

Uma maneira de usar seria a seguinte:

from enum import IntEnum


class ShapeMethod(IntEnum):

    NONE = 0
    circle = 1
    square = 2


class ExampleClass:

    def __init__(self, look_at_shapes=None):
        """
        Args:
            look_at_shapes (dict): A dictionary of shape inputs.
        """
        
        self.shape = None
        self.colour = None

        if look_at_shapes:
            if look_at_shapes[ShapeMethod]:
                self.shape = look_at_shapes[ShapeMethod]

            if look_at_shapes["colour"]:
                self.colour = look_at_shapes["colour"]


    def do_something_with_shape(self):
        if self.shape is ShapeMethod.NONE:
            print('awesome you got a circle.')
        elif self.shape is ShapeMethod.square:
            print('squares have 4 sides.')
        else:
            print('nothing to see here.')


input_var = {
    "colour": 'blue',
    ShapeMethod: ShapeMethod.square
}
my_object = ExampleClass(look_at_shapes=input_var)

my_object.do_something_with_shape()

Em relação à sua pergunta lateral:

Observação: todas as opções ShapeMethod(IntEnum)precisam ser capitalizadas?

Depende inteiramente de você. Eles podem ser todos maiúsculos, o que está de acordo com o PEP 8, pois serão constantes. No entanto, muitas pessoas decidem colocar em maiúscula apenas a primeira letra e é uma escolha válida de estilo. A opção menos comum é usar todas as letras minúsculas ou misturar diferentes capitalizações, mas nada o impede de fazer isso. Veja esta resposta para uma referência completa.

3 EthanFurman Aug 18 2020 at 00:50
input = {
        "shape": ShapeMethod.square,
        "colour": "blue",
        }


def __init__(look_at_shapes=None):
    """
    Args:
        look_at_shapes (dict): A dictionary of shape inputs.
    """
    look_at_shapes = look_at_shapes or {}
    self.shape = look_at_shapes.get("shape", ShapeMethod.NONE)
    self.colour = look_at_shapes.get("colour")  # None if "colour" doesn't exist

    def do_something_with_shape:
        if self.shape == ShapeMethod.circle:
            print('awesome you got a circle'.)
        elif self.shape == ShapeMethod.square:
            print('squares have 4 sides.')
        else:
            print('nothing to see here.')
2 Jab Aug 18 2020 at 00:23

Você precisa verificar em vez self.shape.valuede self.shapequando está procurando verificar a string subjacente na classe enum.

if self.shape.value == 'circle':

Ou

if self.shape == ShapeMethod.circle