Wie können die TypeVars für Self in der Klassenmethode einer generischen Klasse genutzt werden?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie können die TypeVars für Self in der Klassenmethode einer generischen Klasse genutzt werden?

by Guest » 03 Jan 2025, 11:12

Ich versuche, das Folgende (vereinfachtes Beispiel) mit mypy --strict zu übergeben:

Code: Select all

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

was fast funktioniert, aber Mypy Compalins über das nicht spezifizierte Generikum für TypeVar F. Ich kann F = TypeVar("F",bound="Foo[list[T]]") nicht angeben, da dies zur Folge hat, dass die Typvariable „__main__.T“ ungebunden ist. Es scheint auch nicht korrekt zu sein, dass die U TypeVar nur an einer Stelle referenziert wird.
Gibt es eine bessere Möglichkeit, die richtigen Typanmerkungen zu erhalten und gleichzeitig Unterklassen zu unterstützen? Kann der Typ von cls mit denselben TypeVars wie das Argument foos gebunden werden (d. h. die U TypeVar nutzen), ohne dass Bar[list[int]] angegeben werden muss? Code> ?

Top