Как можно использовать TypeVars for Self в методе class общего класса?Python

Программы на Python
Ответить
Anonymous
 Как можно использовать TypeVars for Self в методе class общего класса?

Сообщение Anonymous »

Я пытаюсь передать следующий (упрощенный пример) с помощью mypy --strict:

Код: Выделить всё

from typing import TypeVar, reveal_type

# Missing type parameters for generic type "list"  [type-arg]
F = TypeVar("F", bound="Foo[list]")
U = TypeVar("U")

class Foo[T]:
def __init__(self, value: T) -> None:
self.value = value

def get_value(self) -> T:
return self.value

@classmethod
def join(cls: type[F], foos: list[Foo[U]]) -> F:
return cls([f.value for f in foos])

class Bar[T](Foo[T]):
...

# Correctly revealed as `Bar[list[int]]`
reveal_type(Bar[list[int]].join([Bar(1), Bar(2)]))

который почти работает, но mypy сообщает о неопределённом обобщенном значении для TypeVar F. Я не могу указать F = TypeVar("F",bound="Foo[list[T]]"), так как это дает переменную типа "__main__.T" несвязанной. Также некорректно ссылаться на U TypeVar только в одном месте.
Есть ли лучший способ получить правильные аннотации типов, сохраняя при этом поддержку подклассов? Можно ли связать тип cls с использованием тех же переменных TypeVar, что и аргумент foos (т. е. использовать U TypeVar), избегая необходимости указывать Bar[list[int]]. ?

Подробнее здесь: https://stackoverflow.com/questions/793 ... lassmethod
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»