为什么Python的`除了'使用`isinstance`?

时间:2010-10-01 22:35:16

标签: python exception exception-handling types isinstance

except的{​​{3}}说:

  

对于带有。的except子句   表达,表达式   评估,并且该条款匹配   如果生成的对象是异常   与此例外的“兼容”。一个   object与异常兼容   如果它是异常对象的类或基类,[...]

为什么except不使用isinstance而不是比较基类?这阻止了使用__instancecheck__覆盖实例检查。

修改

我可以理解,这不存在的原因之一是没有人考虑过它。但有什么理由不能实现吗?

修改

Python 3.2a中的Shell会话显示尝试使用__subclasscheck__不起作用:

>>> class MyType(type): __subclasscheck__ = lambda cls, other_cls: True
>>> class O(Exception, metaclass=MyType): pass
>>> issubclass(3, O)
0: True
>>> issubclass(int, O)
1: True
>>> try:
...     1/0
... except O:
...     print('Success')
Traceback (most recent call last):
  File "<pyshell#4>", line 2, in <module>
    1/0
ZeroDivisionError: division by zero
>>> 

2 个答案:

答案 0 :(得分:3)

简单的答案可能是没有人考虑过它。更复杂的答案是没人会考虑它,因为很难做到这一点,因为它意味着在处理异常时执行可能任意的Python代码,并且它具有可疑的价值。 Python中的异常类通常是非常简单的类,并且使用功能重载它们通常是一个错误。很难想象让它咨询__instancecheck__的情况。如果您有这种情况(有或没有补丁),请提交一个错误,有人可能会提起它。

答案 1 :(得分:1)

  

但这有什么理由吗?   不应该实施?

你能给出一个有用的例子吗?

执行此操作时:

class SomeMeta(type):
    def __subclasscheck__(cls, sub):
        print (cls, sub)
        return True

class Something(Exception):
    pass

class SomeType(Exception):
    __metaclass__ = SomeMeta

try:
    raise Something()
except SomeType, e:
    pass

# prints (<class '__main__.SomeType'>, <class '__main__.Something'>)

Python在__subclasscheck__的元类上调用SomeType来确定SomethingSomeType的子类。 Metaclass PEP更详细地讨论了这一点。