Доступ к перечислению родителей - PullRequest
0 голосов
/ 23 марта 2020

У меня есть класс диагностики c (технически @dataclass написано в python). В классе Diagnosti c в настоящее время есть метод класса, соответствующий «уровню» сообщения Diagnosti c (информация ie, предупреждение, ошибка). У него также есть перечисление, Level:

@dataclass
class Diagnostic:
    #instance variables bc dataclass
    severity: Level
    message: str
    start: Tuple[int, int]
    end: Tuple[int, int]

    class Level(enum.IntEnum):
        info = 0
        error = 1
        warning = 2
        #....

@classmethod
    def create(...)
        #....

@classmethod
    def info(...)
        #....

@classmethod
    def warning(...)
        #....

@classmethod
    def error(...)
        #....

Я бы хотел изменить это так, чтобы каждое сообщение о диагностике c имело свой собственный класс. До сих пор я придумал это иерархия, где Diagnostic_Error, Diagnostic_Info и Diagnostic_Warning являются дочерними элементами Diagnostic класса (который больше не является dataclass):

class Diagnostic:
    # instance properties
    __slots__ = ("message", "start", "end")

    def __init__(
        self, message: str, start: Tuple[int, int], end: Tuple[int, int]
    ) -> None:
        self.message = message
        self.start = start
        self.end = end

    class Level(enum.IntEnum):
        info = 0
        error = 1
        warning = 2

        # but do we still need this?
        @classmethod
        def from_docutils(cls, docutils_level: int) -> "Diagnostic.Level":
            level = docutils_level - 1
            level = min(level, cls.warning)
            level = max(level, cls.info)
            return cls(level)


class Diagnostic_Info(Diagnostic):
    severity: Diagnostic.Level = Level.info


class Diagnostic_Warning(Diagnostic):
    severity: Diagnostic.Level = Level.warning


class Diagnostic_Error(Diagnostic):
    severity: Diagnostic.Level = Level.error

Однако я получаю Name 'Level' is not defined ,

Как получить доступ к перечислению родителей из дочернего класса? В таком случае, как мне получить доступ к Level из Diagnostic_Error, Diagnostic_Info и Diagnostic_Warning?

1 Ответ

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

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

class Diagnostic_Info(Diagnostic):
    severity: Diagnostic.Level = <b>Diagnostic.</b>Level.info
...