3

我是初学者。来这里学习。

一段代码正在引发 WindowsError。我抓住它并将其重命名为exception.

dir(exception)我通过,内省对象,type(exception)试图print(exception.__dict__)找到一个引用来运行一些文档命令:例如 help(areference)`。

我找不到 WindowsError 的定义位置。我试过help(os.WindowsError)了,但这显然无济于事。

最终目的是找到 WindowsError 的来源,但是对于这个问题,我从谷歌那里得到了答案,我想学习如何通过 Python 命令找到这个问题。

具体来说:

  • 获取定义类型的模块
  • 获取我在异常中获得的类的超类型(甚至......任何类?!)

我反省错了吗?有没有更好的方法来做到这一点?

4

2 回答 2

2

问题1:定义类型的模块

根据我的 Python,它是在名为的内置模块中定义的exceptions

>>> WindowsError
<type 'exceptions.WindowsError'>

__module__以编程方式,您可以通过读取其属性找出定义类型的模块:

>>> WindowsError.__module__
'exceptions'
>>> sys.modules[WindowsError.__module__]
<module 'exceptions' (built-in)>

问题2:找到一个类型的超类

类型的__bases__属性列出了它的超类。

>>> WindowsError.__bases__
(<type 'exceptions.OSError'>,)

问题3:给定对象的类型是什么

你实际上并没有问这个问题,但你的评论表明你应该这样做。要查找对象的类型,请使用该type()函数。

>>> i = 666
>>> type(i)
<type 'int'>
>>> type(i).__bases__
(<type 'object'>,)
>>> type(i).__module__
'__builtin__'

所以,当你捕获一个异常时,你有一个对象而不是一个类型,也就是说你有一个类的实例。所以要了解类型你必须首先使用type()来获取类型。

于 2013-02-21T14:35:13.033 回答
2

您可能想看一下该inspect模块。特别是inspect.getmodule功能。

要获取一个类的父类,您可以简单地查看一个类__bases__属性:

>>> IOError.__bases__
(<type 'exceptions.EnvironmentError'>,)

或者可以通过__mro__属性获取类的层次结构:

>>> IOError.__mro__
(<type 'exceptions.IOError'>, <type 'exceptions.EnvironmentError'>, <type 'exceptions.StandardError'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

__mro__告诉你python在类层次结构中以什么顺序查找方法和属性。

请注意,由于 python 允许多重继承,您不能定义“超类”的概念。每个类可以有多个父类,层次结构可以成为一个相当复杂的图,试图考虑超类只会导致陷阱(例如,当子类重新定义签名等时,方法调用失败等)

于 2013-02-21T14:35:48.327 回答