Есть ли простой способ напечатать иерархию классов в древовидной форме?

Есть ли функция, которая может напечатать иерархию класса Python в виде дерева, как git log --graph делает для мерзавца совершает?

Пример того, что я хотел бы сделать:

class A(object): pass
class B(A): pass
class C(B): pass
class D(A): pass
class E(C, D): pass

printtree(E)

Пример того, как может выглядеть вывод (но с вариациями все в порядке). Бонусные баллы, если mro также можно прочитать непосредственно с графика, как я сделал здесь сверху вниз, но если нет, то это тоже хорошо.

E
|\
C |
| D
B |
|/
A
|
object

1 ответ

Решение

Нет, для этого нет встроенной функции, вам придется создать свою собственную. Но знайте, что создание и создание графиков ASCII - это сложная задача, код построения графиков Mercurial (эквивалент Python git log --graph) довольно сложный и сложный.

Было бы гораздо продуктивнее оставить макеты графиков для специальной утилиты, такой как Graphviz. Кто-то уже написал код для этого, см. Эту статью Микеле Симионато, доктор философии, где они обращаются:

class M(type): pass # metaclass
class F(object): pass
class E(object): pass
class D(object): pass
class G(object): __metaclass__=M
class C(F,D,G): pass
class B(E,D): pass
class A(B,C): pass

в

в комплекте с полным MRO, указанным на этикетке. Хотя код был написан более 15 лет назад, он все еще работает, как и задумано, на Python 3 (я тестировал с 3.8.0a1).

Другие вопросы по тегам