Mypy:属性设置程序的分配中不兼容的类型

问题描述 投票:0回答:1

我想将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]")

如何处理此错误?

python typing mypy
1个回答
2
投票

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))

0
投票

set不是Iterable类型。您可以将类型更改为集合,也可以将foo.x分配给[1,2,3]

© www.soinside.com 2019 - 2024. All rights reserved.