Есть ли простой способ напечатать иерархию классов в древовидной форме? - PullRequest
0 голосов
/ 01 марта 2019

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

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

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 Ответ

0 голосов
/ 01 марта 2019

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

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

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

в

enter image description here

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

...