Print the Python Exception/Error Hierarchy

后端 未结 2 1093
不思量自难忘°
不思量自难忘° 2020-12-09 05:39

Is the any command line option in python to print the Exception/Error Class hierarchy?

The output should be similar to http://docs.python.org/2/library/exceptions.ht

2条回答
  •  余生分开走
    2020-12-09 05:45

    Reuse code from the standard library instead of rolling your own.

    import inspect
    import pydoc
    
    def print_class_hierarchy(classes=()):
        td = pydoc.TextDoc()
        tree_list_of_lists = inspect.getclasstree(classes)
        print(td.formattree(tree_list_of_lists, 'NameSpaceName'))
    

    To use this, we need a hierarchy of classes, in the form of a list, that makes sense for us to pass our function. We can build this by recursively searching a classes .__subclasses__() method results, using this function (which I'll keep the canonical version of here):

    def get_subclasses(cls):
        """returns all subclasses of argument, cls"""
        if issubclass(cls, type): # not a bound method
            subclasses = cls.__subclasses__(cls)
        else:
            subclasses = cls.__subclasses__()
        for subclass in subclasses:
            subclasses.extend(get_subclasses(subclass))
        return subclasses
    

    Put this together:

    list_of_classes = get_subclasses(int)
    print_class_hierarchy(list_of_classes)
    

    Which prints (in Python 3):

    >>> print_class_hierarchy(classes)
    builtins.int(builtins.object)
        builtins.bool
        enum.IntEnum(builtins.int, enum.Enum)
            inspect._ParameterKind
            signal.Handlers
            signal.Signals
        enum.IntFlag(builtins.int, enum.Flag)
            re.RegexFlag
        sre_constants._NamedIntConstant
        subprocess.Handle
    enum.Enum(builtins.object)
        enum.IntEnum(builtins.int, enum.Enum)
            inspect._ParameterKind
            signal.Handlers
            signal.Signals
    enum.Flag(enum.Enum)
        enum.IntFlag(builtins.int, enum.Flag)
            re.RegexFlag
    

    This gives us a tree of all subclasses, as well as related multiple inheritance classes - and tells us the modules they live in.

提交回复
热议问题