Llamar a una clase IntEnum desde dentro de un diccionario

Aug 18 2020

Tengo una clase IntEnum de ejemplo:

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

Eso debe ser llamado por la __init__función de otra clase:

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.')

donde, el self.shapeatributo debe estar circle, squareo NONE.

La do_something_with_shapefunción sería entonces ser llamado por:

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

La estructura de inputdebe ser un diccionario y es razonablemente simple establecer el colour. Sin embargo, no sé cómo usar correctamente la IntEnumclase desde dentro de un diccionario. Por ejemplo, si quiero imprimirsquares have 4 sides.

Nota: ¿Todas las opciones ShapeMethod(IntEnum)deben estar en mayúsculas?


Lo que he mirado hasta ahora:

La documentación de Python ofrece varios ejemplos; sin embargo, ninguno encaja en mi caso exacto.

Respuestas

4 bad_coder Aug 18 2020 at 00:51

Una forma de uso sería la siguiente:

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()

Con respecto a su pregunta paralela:

Nota: ¿Todas las opciones ShapeMethod(IntEnum)deben estar en mayúsculas?

Depende totalmente de ti. Pueden estar todos en mayúsculas, lo que está de acuerdo con PEP 8 ya que serán constantes. Sin embargo, mucha gente decide poner en mayúscula solo la primera letra y es una elección de estilo válida. La opción menos común es usar todas las minúsculas o mezclar diferentes mayúsculas, sin embargo, no hay nada que le impida hacerlo. Consulte esta respuesta para obtener una referencia 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

self.shape.valueDebe verificar en lugar de self.shapecuándo está buscando verificar la cadena subyacente en la clase enum.

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

O

if self.shape == ShapeMethod.circle