如何让Python函数参数的Mypy类型兼容list、tuple、range及numpy.array?
问题描述
现有一段代码可正常运行,但Mypy仅通过第一个join调用的类型检查,其余调用均报错:
import numpy as np def join(v:list, delim:str = ","): """ join the elements of v using the given delimiter """ return delim.join(str(x) for x in v) print(join([0,1,2,3])) print(join((0,1,2,3))) print(join(range(4))) print(join(np.array(range(4))))
Mypy报错信息如下:
x.py:8: error: Argument 1 to "join" has incompatible type "Tuple[int, int, int, int]"; expected "List[Any]" [arg-type] x.py:9: error: Argument 1 to "join" has incompatible type "range"; expected "List[Any]" [arg-type] x.py:10: error: Argument 1 to "join" has incompatible type "ndarray[Any, dtype[Any]]"; expected "List[Any]" [arg-type] Found 3 errors in 1 file (checked 1 source file)
是否存在适用于参数v的其他类型注解,能够修复这些错误?
解决方案
当然有,可根据需求选择以下几种类型注解方案:
1. 使用Iterable[Any](推荐)
这是最通用的方案,函数核心仅需遍历v的元素,所有可迭代对象都符合要求,包括列表、元组、range、numpy数组等:
from typing import Iterable import numpy as np def join(v: Iterable[Any], delim: str = ","): """ join the elements of v using the given delimiter """ return delim.join(str(x) for x in v)
该方案能覆盖所有当前传入的参数类型,Mypy会完全认可所有调用。
2. 使用Union明确限定支持类型
如果想严格限定只接受特定几种可迭代类型,可通过Union列出:
from typing import Union, List, Tuple import numpy as np def join(v: Union[List[Any], Tuple[Any, ...], range, np.ndarray], delim: str = ","): """ join the elements of v using the given delimiter """ return delim.join(str(x) for x in v)
这种方式更严谨,但后续若要支持新的可迭代类型,需手动更新Union的内容。
3. 使用Sequence[Any](不适用于numpy数组)
Sequence涵盖列表、元组、range等有序可迭代对象,但numpy的ndarray不属于Sequence类型(尽管它可迭代),因此该方案无法通过numpy数组的类型检查,适合不需要支持numpy数组的场景:
from typing import Sequence import numpy as np def join(v: Sequence[Any], delim: str = ","): """ join the elements of v using the given delimiter """ return delim.join(str(x) for x in v)
内容的提问来源于stack exchange,提问作者Fortranner
相关产品推荐
相关产品推荐

