Chiama una classe IntEnum dall'interno di un dizionario

Aug 18 2020

Ho una classe IntEnum di esempio:

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

Questo deve essere chiamato dalla __init__funzione di un'altra 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.')

dove l' self.shapeattributo deve essere circle, squareo NONE.

La do_something_with_shapefunzione verrebbe quindi chiamata da:

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

La struttura di inputdeve essere un dizionario ed è ragionevolmente semplice impostare l'estensione colour. Tuttavia, non so come utilizzare correttamente la IntEnumclasse dall'interno di un dizionario. Ad esempio, se voglio stamparesquares have 4 sides.

Nota: tutte le opzioni ShapeMethod(IntEnum)devono essere in maiuscolo?


Quello che ho visto finora:

La documentazione per Python fornisce una serie di esempi; tuttavia, nessuno si adatta al mio caso esatto.

Risposte

4 bad_coder Aug 18 2020 at 00:51

Un modo per utilizzare sarebbe il seguente:

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

Per quanto riguarda la tua domanda secondaria:

Nota: tutte le opzioni ShapeMethod(IntEnum)devono essere in maiuscolo?

Dipende interamente da te. Possono essere tutte maiuscole, il che è in accordo con PEP 8 poiché saranno costanti. Tuttavia, molte persone decidono di mettere in maiuscolo solo la prima lettera ed è una valida scelta di stile. L'opzione meno comune è usare tutte le lettere minuscole o mescolare diverse lettere maiuscole, tuttavia non c'è nulla che ti impedisca di farlo. Vedi questa risposta per un riferimento completo.

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

È necessario controllare self.shape.valueINSEAD di self.shapequando stai cercando di controllare la stringa sottostante nella classe enum.

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

O

if self.shape == ShapeMethod.circle