たとえば、比較ソート関数を記述したい場合、入力はSequence[T]
(またはMutableSequence[T]
この場合は) を含むシーケンスでなければならないことを示唆できます。
from typing import MutableSequence, T
def comparison_sort(s: MutableSequence[T]) -> None:
pass
T
しかし、が比較可能であることを示唆するすぐに使用できる方法はないようです。( にはComparable
やOrdered
などはありません。) これを実現するにはどうすればよいですか? 、typing
などの特定の型セットを指定しないようにして、ユーザーが自分の型が比較可能であることを示唆できるようにしたいと思います。int
float
str
ベストアンサー1
コメントで述べたように、Comparable
は状態ではなく、型のペアの記述子としてのみ意味があります。通常、ソート関数は同種の型で動作しますが、型チェッカーが「任意の型をサポートする<
」という概念ではなく「一部の型をサポートする」という概念のみを処理することを気にしない限り<
、独自のものを定義しComparable
、それをバインドすることができますtyping
TypeVar
。便利なことに、ペップ484(typing
ヒントを定義する)はすでに提供されているこれをどうやって行うかの例:
from abc import ABCMeta, abstractmethod
from typing import Any, TypeVar
class Comparable(metaclass=ABCMeta):
@abstractmethod
def __lt__(self, other: Any) -> bool: ...
CT = TypeVar('CT', bound=Comparable)
これを次のように定義に使用できますcomparable_sort
。
def comparable_sort(s: MutableSequence[CT]) -> None:
定義される必要があるだけであることに注意してください__lt__
。原則として、Python 3 は独自のソート関数を完全に † で実装します__lt__
(他の豊富な比較演算子は使用しません。 も使用しません__eq__
) 。そのため、独自のアルゴリズムを同じように設計して、何でもsorted
同じように処理できるようにすることをお勧めします。
† : Python 2 は元々__le__
少なくとも 1 か所 ( heapq
) で使用されていましたが、Python 3 の期間では組み込み関数と標準ライブラリに対して意図的に一貫して使用されており__lt__
、入力スタイルは Python 3 専用です。