我想创建一个数组类型,它应该是可下标的,且是 `typing.List` 和 `numpy.ndarray` 类型的联合体。我知道 `numpy` 没有内置存根文件,但是这里那些 numpy 存根文件(由 Machinalis 编写)应该可以正常工作,因为它们是可下标的。
以下是期望的行为:
以下是期望的行为:
def foo(bar: Array[int])->None:
pass
foo([1,2,3]) # No typing error
foo(numpy.arange(4)) # No typing error
foo((1,2,3)) # Error: Expected Array[int], got Tuple[int]
foo([1.,2.,3.]) # Error: Expected Array[int], got Array[float]
我尝试了几种方法,但都没有按预期工作。
你会如何在 Python 3.7 中做到这一点?
即使它不能满足元组错误,我也会接受某种鸭子类型的解决方案。重点是创建可下标联合的可下标类型。
谢谢。
我的最佳尝试: (mypy 错误���在注释中)
class _meta_getitem(type):
def __getitem__(cls, x):
return cls.__getitem__(cls, x)
class Array(metaclass=_meta_getitem):
def __getitem__(self, element_type: type) -> type:
array_type = typing.Union[List[element_type], # error: Invalid type "element_type"
numpy.ndarray[element_type]]
return typing.NewType("Array[{}]".format(element_type.__name__),
array_type) # The type alias to Union is invalid in runtime context
if __name__ == "__name__":
x: Array[int] = numpy.arange(4) # "Array" expects no type arguments, but 1 given
Union[List[int], numpy.ndarray[int]]
不起作用?你尝试了什么? - chepnerUnion[List, ndarray][int]
而不是Union[List[in], ndarray[int]]
(然后基本上将Array
作为Union[List, ndarray]
的别名)。 - chepnerArray = typing.Union[List, numpy.ndarray]
不起作用。也就是说,x:Array[int] =[1,2]
会引发“错误:类型别名的参数数量错误,期望值:0,给定值:1”。 - bonoboris