让我们假设我们需要一个函数,只要两个参数具有相同的类型,它就可以接受任何类型的两个参数。您将如何使用 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 可以确保 to 的参数f
是两个int
s 或两个str
s 或两个 s 列表int
或两个返回的零参数函数int
。
但是如果我们事先不知道类型怎么办?如果我们需要类似于let f (a:'t) (b:'t) = ()
F# 和 OCaml 的东西怎么办?简单的写作T = TypeVar('T')
会使事情变得f(1, "2")
有效,这不是我们想要的。