Документация Python для except
гласит:
Для исключающей оговорки с
выражение, это выражение
оценивается, и предложение соответствует
исключение, если результирующий объект
«Совместимый» с исключением.
объект совместим с исключением
если это класс или базовый класс объекта исключения , [...]
Почему except
не использует isinstance
вместо сравнения базовых классов? Это предотвращает использование __instancecheck__
для переопределения проверки экземпляра.
EDIT:
Я могу понять, что одной из причин, по которой этого не существует, является то, что никто не учел это. Но есть ли причины, по которым это не должно быть реализовано?
EDIT:
Сеанс оболочки из Python 3.2a, показывающий, что попытка использовать __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
>>>