如何使用python类型作为函数进行类型检查?

时间:2020-06-27 09:03:00

标签: python mypy

我不熟悉使用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 documentationint()描述为内置函数,但实际上它的类型为<class 'type'>,因此这种错误类型是合理的。但是,尽管在第二个参数(int)上出现了错误,但是mypy仅在第一个参数为Optional时才抱怨。如果myVar是普通的strint,则键入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

0 个答案:

没有答案