Вызов класса IntEnum из словаря

Aug 18 2020

У меня есть пример класса IntEnum:

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

Это должно быть вызвано __init__функцией другого класса:

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

где self.shapeдолжен быть атрибут circle, squareили NONE.

Затем do_something_with_shapeфункция будет вызываться:

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

Структура inputдолжна быть словарем, и установить colour. Однако я не знаю, как правильно использовать IntEnumкласс из словаря. Например, если я хочу напечататьsquares have 4 sides.

Примечание: все ли варианты ShapeMethod(IntEnum)должны быть написаны с заглавной буквы?


На что я смотрел до сих пор:

В документации по Python есть несколько примеров; однако ни один из них не подходит под мой случай.

Ответы

4 bad_coder Aug 18 2020 at 00:51

Один из способов использования был бы следующим:

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

Относительно вашего побочного вопроса:

Примечание: все ли варианты ShapeMethod(IntEnum)должны быть написаны с заглавной буквы?

Это полностью зависит от вас. Все они могут быть в верхнем регистре, что соответствует PEP 8, поскольку они будут константами. Однако многие люди решают использовать только первую букву с заглавной буквы, и это правильный выбор стиля. Наименее распространенный вариант - использовать все строчные буквы или смешивать разные заглавные буквы, однако ничто не мешает вам это сделать. См. Этот ответ для получения полной справки.

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.valueвнутри, self.shapeкогда вы хотите проверить базовую строку в классе enum.

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

Или же

if self.shape == ShapeMethod.circle