我想将property setter
与mypy一起使用。道具吸气剂和坐便器的类型不同:
from typing import List, Iterable
class Foo:
@property
def x(self) -> List[int]:
...
@x.setter
def x(self, new_x: Iterable[int]):
...
foo = Foo()
foo.x = (1, 2, 3) # error: Incompatible types in assignment (expression has type "Tuple[int, int, int]", variable has type "List[int]")
如何处理此错误?
Mypy抱怨类型不兼容,因为Tuple具有不同的签名:
# For tuples, we specify the types of all the elements
x: Tuple[int, str, float] = (3, "yes", 7.5)
对于setter和getter,如果只是将setter的输入参数分配给类变量,则类型应该相同。 Iterable [int]和Tuple [int,int,int]是不同的类型,因为在这种情况下,元组是不可变的对象,具有3个元素。
处理此错误的方法是在设置为foo.x之前将元组转换为列表:
foo.x = list((1,2,3))
set不是Iterable
类型。您可以将类型更改为集合,也可以将foo.x
分配给[1,2,3]