def tree(cls): yield cls.__name__, 0 yield from sub_tree(cls) # tag::SUB_TREE[] def sub_tree(cls): for sub_cls in cls.__subclasses__(): yield sub_cls.__name__, 1 for sub_sub_cls in sub_cls.__subclasses__(): yield sub_sub_cls.__name__, 2 for sub_sub_sub_cls in sub_sub_cls.__subclasses__(): yield sub_sub_sub_cls.__name__, 3 # end::SUB_TREE[] def display(cls): for cls_name, level in tree(cls): indent = ' ' * 4 * level print(f'{indent}{cls_name}') if __name__ == '__main__': display(BaseException)