python中的任何命令行选项是否可以打印Exception/Error Class层次结构?打印Python异常/错误层次
输出应该类似于http://docs.python.org/2/library/exceptions.html#exception-hierarchy
python中的任何命令行选项是否可以打印Exception/Error Class层次结构?打印Python异常/错误层次
输出应该类似于http://docs.python.org/2/library/exceptions.html#exception-hierarchy
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
重用代码滚动你自己的。
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
这给了我们一棵树的所有子类,以及相关的多继承类 - 并告诉我们他们住的模块。