抽象基底クラスを使用すると、Python は実際に試してみなくてもオブジェクトの動作を知る方法を提供します。標準ライブラリでは、 collections.abcにコンテナ用に定義されたいくつかの ABC があります。たとえば、引数が反復可能であることをテストできます。
from collections.abc import Iterable
def function(argument):
if not isinstance(argument, Iterable):
raise TypeError('argument must be iterable.')
# do stuff with the argument
クラスのインスタンスを比較できるかどうかを判断するための ABC が 1 つあることを期待していましたが、見つけることができませんでした。メソッドの存在をテストする__lt__
だけでは不十分です。たとえば、辞書は比較できませんが、__lt__
まだ定義されています (object
実際と同じ)。
>>> d1, d2 = {}, {}
>>> d1 < d2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < dict()
>>> hasattr(d1, '__lt__')
True
私の質問は次のとおりです。比較自体を行わずにキャッチする簡単な方法はありTypeError
ますか?
私の使用例は、並べ替えられたコンテナーに似ています。最初の要素を挿入するときに例外を発生させ、2 番目の要素を待たないようにしたいと考えています。要素をそれ自体と比較することを考えましたが、より良いアプローチはありますか:
def insert(self, element):
try:
element < element
except TypeError as e:
raise TypeError('element must be comparable.')
# do stuff