有没有办法将引发的异常等同于其他一些值

时间:2013-05-31 10:26:49

标签: python assert

我正在尝试python-koans:

定义了一个旧样式类:

class A:
    pass

我们知道旧样式类没有定义__class__

提供了一个断言声明,我需要通过该声明。

self.assertEqual(__, A.__class__)

我应该在空白中填充一些值,即第一个参数,以便它通过。 A.__class__会引发属性错误。我该怎么做这个测试通过?

3 个答案:

答案 0 :(得分:1)

使用type()而不是直接尝试访问.__class__。对于旧式类,这将返回types.ClassType

>>> from types import ClassType
>>> class Foo: pass
...
>>> type(Foo) is ClassType
True

一般来说,对于每个dunder(双下划线,__...__)名称,这些钩子都有一个API函数或运算符。使用API​​函数或运算符而不是直接访问钩子。例如。使用str(f)代替f.__str__()

如果您要针对异常进行测试,您可能希望使用assertRaises() context manager来测试特定的异常:

with self.assertRaises(Foo) as cm:
     function_under_test()

然后,您仍可以cm.exception访问异常实例以进行进一步测试。

答案 1 :(得分:1)

这是一个糟糕的主意,但是嘿 - Python可以让你做任何事情,对吗?

assertEqual(setattr(A, "__class__", type) or type, A.__class__)

我想我可能会作弊。

答案 2 :(得分:0)

这可能是无关紧要的,但可能的用例是将异常类等同于特定的异常类。附加示例代码

try:
    1/0
except (ZeroDivisionError) as e:
    pass
#equate an exception with a class of exception
isinstance(e, ZeroDivisionError)