Смешивание перечислений и проверка того, является ли объект перечисления одним из подмножеств класса

#python #class #enums #class-method

Вопрос:

У меня есть str Enum класс mixin , который позволяет другим частям моего кода получать доступ к строковому представлению состояний моих переменных.

Существует определенный citrus тип перечисления, который может быть из подмножества всех возможных перечислений. В настоящее время я использую a classmethod для проверки «цитрусовости» как таковой:

 from enum import Enum

class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    citrus = {orange, lemon}

    @classmethod
    def is_citrus(cls, state):
        return state in cls.citrus
 

[Использование]:

 >>> o = Fruits.orange
>>> Fruits.is_citrus(o)
True
 

Мои вопросы таковы:

  • Подходит ли там метод класса?
  • Есть ли лучший способ улучшить проверку «цитрусовости»?
  • В настоящее время мне придется использовать Fruits.is_citrus методы для проверки o объекта перечисления, как можно Fruit изменить класс таким образом, чтобы я мог сделать что-то подобное o.is_citrus() ?

Комментарии:

1. Ты хотел написать class Fruits вместо def Fruits этого ?

Ответ №1:

Сделайте это обычным методом экземпляра:

 class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    citrus = {orange, lemon}

    def is_citrus(self):
        return self in self.citrus
 

Я не уверен citrus = {orange, lemon} , что он делает именно то, что вы думаете (в итоге он становится строковым представлением набора, а не фактическим набором)-вместо того, чтобы иметь citrus собственное значение перечисления, я бы реализовал концепцию «цитрусовости» исключительно внутри is_citrus , как это:

     def is_citrus(self):
        return self in {Fruits.orange, Fruits.lemon}
 

Комментарии:

1. Тьфу, вот почему перечисления строк сводят на нет весь смысл. Это понятно для обратной совместимости, но это все

Ответ №2:

Что вы думаете об использовании a @property ?

 class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    @property
    def is_citrus(self):
        return self in ['orange', 'lemon']
 
 >>> o = Fruits.orange
>>> o.is_citrus
True

>>> a = Fruits.apple
>>> a.is_citrus
False