我不熟悉使用python进行类型检查,并且想创建一个采用单个值的函数,如果该值为None
,则返回None
,或者返回应用a的结果功能。它可以工作,但在将类型作为函数传递时,例如int
,则不进行类型检查。
from typing import Callable, Optional, TypeVar, Union
A = TypeVar('A')
B = TypeVar('B')
def maybe(val: A, fn: Callable[[A], B]) -> Optional[B]:
if val is not None:
return fn(val)
return None
myVar: Optional[Union[str, int]] = "42"
ret = maybe(myVar, int)
当我调用maybe(myVar, myFn)
并且myFn
是正常函数或lambda时,这似乎可以正常工作并键入check OK。但是,如果我尝试maybe(myVar, int)
,则mypy
会抱怨int
的类型错误:
test.py:12: error: Argument 2 to "maybe" has incompatible type "Type[int]"; expected "Callable[[Union[str, int, None]], int]"
尽管the documentation将int()
描述为内置函数,但实际上它的类型为<class 'type'>
,因此这种错误类型是合理的。但是,尽管在第二个参数(int
)上出现了错误,但是mypy
仅在第一个参数为Optional时才抱怨。如果myVar
是普通的str
或int
,则键入OK。
我尝试将函数签名更改为接受类型以及可调用对象:
from typing import Callable, Optional, Type, TypeVar, Union
A = TypeVar('A')
B = TypeVar('B')
def maybe(val: A, fn: Union[Callable[[A], B], Type[B]]) -> Optional[B]:
if val is not None:
return fn(val)
return None
myVar: Optional[Union[str, int]] = "42"
ret = maybe(myVar, int)
已解决了在调用maybe()
时的错误。相反,在return fn(val)
行,mypy
给出了一个我不理解的错误:
test.py:8: error: Too many arguments for "object"
如何解决此错误?有什么更蟒蛇的方式来做我想要的吗?
Python 3.7.7
mypy 0.770