【问题标题】:Print the Python Exception/Error Hierarchy打印 Python 异常/错误层次结构
【发布时间】:2013-08-20 05:42:18
【问题描述】:

python 中是否有任何命令行选项来打印异常/错误类层次结构?

输出应该类似于http://docs.python.org/2/library/exceptions.html#exception-hierarchy

【问题讨论】:

    标签: python class exception


    【解决方案1】:

    重用标准库中的代码,而不是自己编写代码。

    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'))
    

    要使用它,我们需要一个列表形式的类层次结构,这对我们传递函数是有意义的。我们可以通过递归搜索类.__subclasses__()方法结果来构建它,使用这个函数(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
    

    把这些放在一起:

    list_of_classes = get_subclasses(int)
    print_class_hierarchy(list_of_classes)
    

    哪些打印(在 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
    

    这为我们提供了所有子类以及相关的多重继承类的树 - 并告诉我们它们所在的模块。

    【讨论】:

      【解决方案2】:

      inspect 模块可能会有所帮助,特别是 getclasstree() 函数:

      将给定的类列表排列成嵌套列表的层次结构。 在嵌套列表出现的地方,它包含从 其条目紧接在列表之前的类。

      inspect.getclasstree(inspect.getmro(Exception))
      

      或者,您可以通过继承树递归遍历__subclasses__(),如下所示:

      def classtree(cls, indent=0):
          print '.' * indent, cls.__name__
          for subcls in cls.__subclasses__():
              classtree(subcls, indent + 3)
      
      classtree(BaseException)
      

      打印:

       BaseException
      ... Exception
      ...... StandardError
      ......... TypeError
      ......... ImportError
      ............ ZipImportError
      ......... EnvironmentError
      ............ IOError
      ............... ItimerError
      ............ OSError
      ......... EOFError
      ......... RuntimeError
      ............ NotImplementedError
      ......... NameError
      ............ UnboundLocalError
      ......... AttributeError
      ......... SyntaxError
      ............ IndentationError
      ............... TabError
      ......... LookupError
      ............ IndexError
      ............ KeyError
      ............ CodecRegistryError
      ......... ValueError
      ............ UnicodeError
      ............... UnicodeEncodeError
      ............... UnicodeDecodeError
      ............... UnicodeTranslateError
      ......... AssertionError
      ......... ArithmeticError
      ............ FloatingPointError
      ............ OverflowError
      ............ ZeroDivisionError
      ......... SystemError
      ............ CodecRegistryError
      ......... ReferenceError
      ......... MemoryError
      ......... BufferError
      ...... StopIteration
      ...... Warning
      ......... UserWarning
      ......... DeprecationWarning
      ......... PendingDeprecationWarning
      ......... SyntaxWarning
      ......... RuntimeWarning
      ......... FutureWarning
      ......... ImportWarning
      ......... UnicodeWarning
      ......... BytesWarning
      ...... _OptionError
      ... GeneratorExit
      ... SystemExit
      ... KeyboardInterrupt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        相关资源
        最近更新 更多