両方の引数が同じ型である限り、任意の型の 2 つの引数を受け入れる関数が必要であると仮定しましょう。mypyで静的にチェックするにはどうすればよいですか?
関数が既知の型の有限量を受け入れるだけでよい場合は、次のように簡単です。
from typing import TypeVar, List, Callable
T = TypeVar('T', int, str, List[int], Callable[[], int])
def f(a: T, b: T) -> None:
pass
f(1, 2)
f("1", "2")
f([1], [2])
f(lambda: 1, lambda: 2)
f(1, "2") # mypy will print an error message
このコードでは、 mypy は への引数f
が 2 つint
の 、2 つstr
の 、または の 2 つのリスト、int
または を返す引数ゼロの 2 つの関数であることを確認できint
ます。
しかし、事前に型がわからない場合はどうなるでしょうか。let f (a:'t) (b:'t) = ()
F# や OCamlに似たものが必要な場合はどうすればよいでしょうか? 単純に書くと有効なT = TypeVar('T')
ようになりますが、これは私たちが望んでいることではありません。f(1, "2")