Mypy: несовместимые типы в присваивании для установщика свойств - PullRequest
0 голосов
/ 29 января 2020

Я хочу использовать 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]")

Как мне справиться с этой ошибкой?

1 Ответ

2 голосов
/ 09 февраля 2020

Mypy жалуется, что типы несовместимы, потому что Tuple имеет различную сигнатуру:

# For tuples, we specify the types of all the elements
x: Tuple[int, str, float] = (3, "yes", 7.5)

В случае сеттеров и геттеров, если вы просто назначаете входной параметр сеттера для переменной класса, тип должен быть одинаковым. Iterable [int] и Tuple [int, int, int] - это разные типы, потому что в этом случае кортеж является неизменным объектом и имеет 3 элемента.

Способ устранения этой ошибки состоит в преобразовании кортежа в список перед установкой в foo.x:

foo.x = list((1,2,3))
...