Как использовать подкласс NamedTuple в качестве типа элемента для универсального класса, наследуемого от Deque - PullRequest
0 голосов
/ 18 марта 2019

Я не могу заставить работать общий тип.Я подкласс класса Deque.Каждый элемент Deque будет экземпляром SomeNamedTuple.

from typing import NamedTuple, Deque, TypeVar

class SomeNamedTuple(NamedTuple):
    field1: int
    field2: str

T = TypeVar("T", bound=NamedTuple)

class SomeDeque(Deque[T]):
    def some_method(self) -> None:
        if self:
            print(self[0]._fields)

mydeque = SomeDeque[SomeNamedTuple]()
$ mypy --strict foo.py
foo.py:14: error: Value of type variable "T" of "SomeDeque" cannot be "SomeNamedTuple"

Я вставил некоторую отладку в mypy / applytype.py, где генерируется ошибка:

upper_bound = callable.variables[i].upper_bound
if not mypy.subtypes.is_subtype(type, upper_bound):
    if skip_unsatisfied:
        types[i] = None
    else:
        print(f'type = {type}')
        print(f'upper_bound = {upper_bound}')
        msg.incompatible_typevar_value(callable, type, callable.variables[i].name, context)

и похоже, что он думает, что тип является Tuple (не NamedTuple):

$ mypy --strict foo.py                                                                                                                                                                                                                       
type = Tuple[builtins.int, builtins.str, fallback=foo.SomeNamedTuple]
upper_bound = typing.NamedTuple
foo.py:14: error: Value of type variable "T" of "SomeDeque" cannot be "SomeNamedTuple"

Что я делаю не так?

...