型が型付けと同等であることを示唆するにはどうすればいいですか?質問する

型が型付けと同等であることを示唆するにはどうすればいいですか?質問する

たとえば、比較ソート関数を記述したい場合、入力はSequence[T](またはMutableSequence[T]この場合は) を含むシーケンスでなければならないことを示唆できます。

from typing import MutableSequence, T

def comparison_sort(s: MutableSequence[T]) -> None:
    pass

Tしかし、が比較可能であることを示唆するすぐに使用できる方法はないようです。( にはComparableOrderedなどはありません。) これを実現するにはどうすればよいですか? 、typingなどの特定の型セットを指定しないようにして、ユーザーが自分の型が比較可能であることを示唆できるようにしたいと思います。intfloatstr

ベストアンサー1

コメントで述べたように、Comparableは状態ではなく、型のペアの記述子としてのみ意味があります。通常、ソート関数は同種の型で動作しますが、型チェッカーが「任意の型をサポートする<」という概念ではなく「一部の型をサポートする」という概念のみを処理することを気にしない限り<、独自のものを定義しComparable、それをバインドすることができますtyping TypeVar。便利なことに、ペップ484typingヒントを定義する)はすでに提供されているこれをどうやって行うかの例:

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 専用です。

おすすめ記事