` typevar ' s説明


Pythonでタイプの注釈に全く慣れていないなら、私はあなたを始めるべきです.
この投稿では、型変数の使用方法を示しますTypeVar s、楽しさと利益のため.

問題
この関数は引数として何かを受け取り、そのまま返します.返り値の型が同じ型のチェッカーについてどう説明しますかarg ?
def identity(arg):
    return arg

なぜ使用しないAny ?
def identity(arg: Any) -> Any:
    return arg
あなたが使うならばAny , タイプチェッカーはこの機能がどのように機能するかを理解しません:それが心配する限り、機能は全く何でも返すことができます.返り値の型はarg .
本当に欲しいnumber あるint ここで、型チェッカーが次の行でエラーをキャッチします.


なぜ別のタイプの機能を特殊化しないのですか?
def identity_int(arg: int) -> int:
    return arg

def identity_int(arg: str) -> str:
    return arg

def identity_list_str(arg: list[str]) -> list[str]:
    return arg

...
  • これはよくスケールしません.あなたは10回同じ機能を複製するつもりですか?あなたが同期してそれらを維持することを覚えていますか?
  • これがライブラリ機能ならば何か?あなたは人々がこの機能を使用するすべての方法を予測することができなくなります.

  • 解決策:型変数
    型変数を使用すると、いくつかの型を一緒にリンクできます.このようにすると、型変数を使用してidentity 機能
    from typing import TypeVar
    
    T = TypeVar("T")
    
    def identity(arg: T) -> T:
        return arg
    
    ここで、戻り値の型はパラメーター型に“リンク”されます.関数に入れたものは何でも同じことが出ます.
    このようにして動作しているのです(


    型変数への制約の追加
    これは整形式の関数ですか?
    def triple(string: Union[str, bytes]) -> Union[str, bytes]:
        return string * 3
    
    実際には:あなたが文字列を渡す場合は、常に文字列を、同じバイトを取得します.これはあなたがいくつかの痛みを引き起こすでしょうstr そして、あなたが得るときbytes バック.

    「パスしたらstr , あなたが得るstr . あなたが通るならばbytes , あなたが得るbytes ----タイプ変数の仕事のようですね.

    それは十分に公正である.私たちは、私たちのタイプ変数が受け入れるだけである制限を置くことができますstr or bytes (そしてサブクラスはもちろん).
    AnyString = TypeVar("AnyString", str, bytes)
    
    def triple(string: AnyString) -> AnyString:
        return string * 3
    
    unicode_scream = triple("A") + "!"
    bytes_scream = triple(b"A") + b"!"
    

    型変数をパラメータとして使用する
    また、型変数をパラメータとしてジェネリック型に使用することもできますlist or Iterable .
    def remove_falsey_from_list(items: list[T]) -> list[T]:
        return [item for item in items if item]
    
    def remove_falsey(items: Iterable[T]) -> Iterator[T]:
        for item in items:
            if item:
                yield item
    
    Howver、これはトリッキーかなり速い取得します.次の記事で詳しく説明します.

    リンク
  • mypy ジェネリック関数のドキュメントhttps://mypy.readthedocs.io/en/stable/generics.html#generic-functions