Referring to class attributes of a generic type
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
I apologize for posting my question here as an issue; I am doing this out of desperation since my original post on StackOverflow went unanswered for three weeks. Below is a near-verbatim copy from StackOverflow.
I have an abstract base class which defines several class attributes which are types themselves (i.e., nested types); the attributes are overridden in concrete derived classes inheriting from the abstract class. The concrete derived classes are used with several other classes which are type-annotated as generics, where the type parameter has a type constraint that it must be derived from the abstract class. I want these other classes (generics) to refer to the class attributes (nested types) of the concrete classes. The following example should demonstrate the idea:
import typing
class Base:
A: typing.Type[Base]
class One(Base):
class A(Base): # overrides Base.A
pass
class Two(Base):
class A(One): # overrides Base.A
pass
T = typing.TypeVar('T', bound=Base)
class Foo(typing.Generic[T]): # the generic
def foo(self, a: typing.Type[T.A]) -> T: # <-- here, see T.A
...
f: Foo[Two] = Foo()
f.foo(Two.A) # line 22 is here
MyPy v0.701 reports an error on line 22:
Argument 1 to "foo" of "Foo" has incompatible type "Type[A]"; expected "Type[Two]"
MyPy seems to ignore the attribute reference at T.A. How do I make it understand that I am trying to refer to the type available via the attribute .A? The attribute is guaranteed to be available because the type variable T is constrained to Base, which has A. Note that extending the set of generic types is not an option; I could elaborate on this but the explanation would be too specific to my application.
UPDATE: MyPy v0.711 with --new-semantic-analyzer yields a more comprehensible error message:
Name 'T.A' is not defined
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Das Issue nennt keine Repository-Dateien oder Tests; beginne mit dem minimalen Python-Beispiel und verfolge, wie mypy TypeVar-Grenzen, generische Annotationen und Typreferenzen von Klassenattributen behandelt. Als erledigt gilt, wenn das angeforderte Typing-Verhalten eine definierte Implementierung oder Einschränkung hat und durch einen Regressionstest abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100