Каковы условия наследования от str и enum? - PullRequest
3 голосов
/ 17 марта 2020

Каковы предостережения (если таковые имеются) от использования класса, который наследуется от str и Enum?

Это было указано как возможный способ решения проблемы Сериализация Член перечисления в JSON

from enum import Enum

class LogLevel(str, Enum):
    DEBUG = 'DEBUG'
    INFO = 'INFO'

Конечно, смысл в том, чтобы использовать этот класс в качестве перечисления со всеми его преимуществами

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

При наследовании от str или любого другого типа результирующие члены перечисления также относятся к этому типу. Это означает:

  • у них есть все методы этого типа
  • они могут использоваться как этот тип
  • и, что наиболее важно, они будут сравниваться с другими экземплярами этого типа

Этот последний пункт является наиболее важным: поскольку LogLevel.DEBUG является str, он будет сравниваться с другими строками - что хорошо - но также будет сравниваться с другими str на основе Enum s - что может быть плохо.

Информация относительно подкласса enum из документации

0 голосов
/ 17 марта 2020

Этот подход будет работать, когда константы Enum всегда String. Если вы ожидаете, что правая рука всегда будет строковым значением константы, это работает.

Вот один пример, это не будет работать, если я хочу, чтобы правая сторона была закодирована как целое число

   class Status(str, Enum):
       DEFAULT=1

   type(json.dumps(Status.DEFAULT)  

будет выводиться как

...