Appeler une classe IntEnum à partir d'un dictionnaire

Aug 18 2020

J'ai un exemple de classe IntEnum:

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

Cela doit être appelé par la __init__fonction d'une autre 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.')

où, l' self.shapeattribut doit être circle, squareou NONE.

La do_something_with_shapefonction serait alors appelée par:

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

La structure de inputdoit être un dictionnaire et il est raisonnablement simple de définir le colour. Cependant, je ne sais pas comment utiliser correctement la IntEnumclasse depuis l'intérieur d'un dictionnaire. Par exemple, si je veux imprimersquares have 4 sides.

Remarque: toutes les options ShapeMethod(IntEnum)doivent-elles être capitalisées?


Ce que j'ai regardé jusqu'à présent:

La documentation pour Python donne un certain nombre d'exemples; cependant, aucun ne correspond à mon cas exact.

Réponses

4 bad_coder Aug 18 2020 at 00:51

Une façon d'utiliser serait la suivante:

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

Concernant votre question secondaire:

Remarque: toutes les options ShapeMethod(IntEnum)doivent-elles être capitalisées?

Cela dépend entièrement de vous. Ils peuvent être tous en majuscules, ce qui est conforme à PEP 8 car ils seront des constantes. Cependant, beaucoup de gens décident de ne mettre en majuscule que la première lettre et c'est un choix de style valide. L'option la moins courante consiste à utiliser toutes les minuscules ou à mélanger différentes capitalisations, mais rien ne vous empêche de le faire. Voir cette réponse pour une référence complète.

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

Vous devez vérifier self.shape.valueINSEAD self.shapelorsque vous cherchez à vérifier la chaîne sous - jacente dans la classe ENUM.

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

Ou

if self.shape == ShapeMethod.circle