9

Pythonドキュメントexceptは次のように書かれています:

式を含むexcept句の場合、その式が評価され、結果のオブジェクトが例外と「互換性がある」場合、句は例外と一致します。オブジェクトが例外オブジェクトのクラスまたは基本クラスである場合、オブジェクトは例外と互換性があります[...]

基本クラスを比較する代わりにexcept使用しないのはなぜですか? isinstanceこれにより、 を使用__instancecheck__してインスタンス チェックをオーバーライドできなくなります。

編集:

これが存在しない理由の 1 つは、誰もそれを考慮していないことだと理解できます。しかし、これを実装すべきではない理由はありますか?

編集:

__subclasscheck__これを使用しようとしても機能しないことを示す Python 3.2a からのシェル セッション:

>>> 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
>>> 
4

2 に答える 2

4

簡単な答えは、おそらく誰も考えていなかったということです。より複雑な答えは、例外の処理中に潜在的に任意の Python コードを実行することを意味し、疑わしい価値があるため、これを正しく理解するのが難しいため、誰もそれを考慮しなかったということです。通常、Python の例外クラスは非常に単純なクラスであり、機能をオーバーロードすることはしばしば間違いです。相談してもらうケースは考えにくい__instancecheck__。そのような場合 (パッチの有無にかかわらず) は、バグを報告してください。

于 2010-10-01T22:42:06.820 に答える
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__て、 のサブクラスであるかどうかを判断します。Metaclass PEPでは、これについて詳しく説明しています。SomeTypeSomethingSomeType

于 2010-10-01T23:21:05.633 に答える