Есть ли способ "однострочно" это с помощью понимания списка / набора?

Вот мой метод для рекурсивного получения всех подклассов:

@classmethod
def get_subclasses(cls):
    subclasses = set()
    for subclass in cls.__subclasses__():
        subclasses.add(subclass)
        subclasses.update(subclass.get_subclasses())
    return subclasses

Есть ли способ сделать его однострочным? Что-то вроде:

return set(subclass.__subclasses__() for subclass in self.__subclasses__())

3 ответа

Решение

Возможна однострочность, но я думаю, что сохранение двух строк сохраняет ясность:

subclasses = set(cls.__subclasses__())
return subclasses + set(sc.get_subclasses() for sc in subclasses)

Это одна логическая строка, разделенная на две строки источника для большей читабельности:

@classmethod
def get_subclasses(cls):
    return set(cls.__subclasses__()) | {g for s in cls.__subclasses__()
                                            for g in s.get_subclasses()}

Это возвращает имя всех подклассов, наследуемых от Базового класса.

print([cls.__name__ for cls in vars()['Base'].__subclasses__()])
Другие вопросы по тегам