Как перебрать все значения Enum, включая любые вложенные Enum? - PullRequest
1 голос
/ 29 мая 2020

Представьте себе, что у одного есть два класса, производных от Enum, например

class Color(Enum):
    blue = 'blue'
    red = 'red'

class Properties(Enum):
    height = 'h'
    weight = 'w'
    colors = Color

Каков наилучший способ (возможно, рекурсивно) перебирать все Enum-метки вложенного Enum, например Properties, включая те из Enum -членов, как Properties.colors в приведенном выше примере (т.е. включая Color.blue и Color.red)? Проверка типа значения?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Выполнение этого рекурсивно, вероятно, лучший способ. Этот пример немного чище, чем использование блока try except

import inspect

def iter_enum(e):
  for member in e:  
    if inspect.isclass(member.value) and issubclass(member.value, enum.Enum):
        iter_enum(member.value)
    else:
        print(member)

iter_enum(Properties)

Output

Properties.height
Properties.weight
Color.blue
Color.red

1 голос
/ 29 мая 2020

Вот быстрый пример, который их просто распечатывает. Я оставлю это читателю в качестве упражнения, чтобы сделать его генератором c или что-то еще, что применимо к фактическому варианту использования. :)

>>> from typing import Type
>>> def print_enum(e: Type[Enum]) -> None:
...     for p in e:
...         try:
...             assert(issubclass(p.value, Enum))
...             print_enum(p.value)
...         except (AssertionError, TypeError):
...             print(p)
...
>>> print_enum(Properties)
Properties.height
Properties.weight
Color.blue
Color.red
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...