Смущает использование Python Enum при реализации класса - PullRequest
1 голос
/ 21 октября 2019

Я впервые работаю с Enum и буду признателен за любую помощь с кодом ниже. Насколько я понимаю, когда вы определяете класс Enum с набором значений / имен, любое поле / переменная этого конкретного типа Enum не может иметь значений / имен, не входящих в класс Enum.

Предположим, мне нужносоздайте класс аллергии, который имеет поле для «серьезности», которое может иметь значения «LOW, MEDIUM, HIGH», и я должен представить это с помощью enumЯ подумал, что если вход для "серьезности" при создании объекта имеет значение, отличное от LOW, MEDIUM или HIGH, программа выдаст ошибку. Это правильно, или я должен явно проверить, что входные данные присутствуют в классе enum перед установкой / инициализацией "серьезности"? Если мы должны явно проверить, какова цель использования Enum?


from enum import Enum,auto

class Severity(Enum):
    LOW = auto()
    MEDIUM = auto()
    HIGH = auto()

class Allergy:
    def __init__(self, name, symptoms, reporter, severity:Severity):
        self.__name = name
        self.__reporter = reporter        
        self.__symptoms = symptoms
        self.__severity = severity

     def get_severity(self):
        return self.__severity

     def set_severity(self, severity:Severity):
        self.__severity = severity

allergy = Allergy("Dust Allergy","sneezes","Doctor", "5")
print("How severe is the allergy? ",allergy.get_severity())


Я ожидал, что код выдаст ошибку или не запустится, поскольку "5" отсутствует в классе Enum. Но это вывод

How severe is the allergy?  5

Я не уверен, что здесь упускаю что-то очень простое, но ни один из примеров в Интернете, кажется, не рассеивает мои сомнения. Все примеры, которые я видел до сих пор, показывают основной синтаксис / как получить прямой доступ к именам в классе Enum, но не как использовать это в другом классе.

Спасибо.

1 Ответ

1 голос
/ 21 октября 2019

Пара вещей, как упомянуто в его комментарии, использование вами подсказок типов не навязывается автоматически в python. Во-вторых, вы никогда не используете перечисление серьезности, которое вы сделали в своем коде, для проверки правильности, вы можете изменить инициализацию на -

class Allergy:
    def __init__(self, name, symptoms, reporter, severity:Severity):
        self.__name = name
        self.__reporter = reporter        
        self.__symptoms = symptoms
        self.__severity = Severity[severity]

. Теперь она пытается сохранить соответствующую серьезность перечисления, используя указанное имя. В случае, если имя не существует в Enum, оно выдаст NameError, как вы и ожидали.

* Обратите внимание, что вам также необходимо изменить функцию set_severity аналогичным образом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...