Support for @dataclass_transform on Generic's method
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Feature
@dataclass_transform is a PEP-681 feature that is now mostly supported according to #14293. My proposition is to make sure that it can be used inside of a Generic class. What is more, it should handle passing Genaric methods in field_specifiers, like so:
class F(Generic[T]):
@staticmethod
def field(factory: Callable[[T], V]) -> V: ...
class G(Generic[T]):
@staticmethod
@dataclass_transform(field_specifiers=(F[T].field, ))
def foo(c): ...
@G[int].foo
class A:
x: int = F[int].field(factory=lambda x: x+2))
reveal_type(A.__init__) # Type of "A.__init__" is "(self: A, x: int = lambda x: x + 2) -> None"
Pitch
The current behavior is that if you annotate a static method (let alone a method inside a Generic class) with @dataclass_transform mypy won't treat it as dataclass-making decorator (see mypy playground). In this regard pyright does a better job as it allows you to do it (see pyright playground).
If the type checker would allow for the aforementioned feature, then this pattern would be possible to implement (using the above defined code):
class UserModel:
id: str
name: str
class ItemModel:
id: str
price: int
@G[UserModel].foo
class User:
id: str = F[UserModel].field(factory = lamda user: user.id)
name: str = F[UserModel].field(factory = lamda user: user.name)
more_data: str
@G[ItemModel].foo
class User:
id: str = F[ItemModel].field(factory = lamda item: item.id)
price: int = F[ItemModel].field(factory = lamda item: item.price)
more_data: str
The type checker should be able to catch type mismatches between the decorator and field, like so:
@G[UserModel].foo
class User:
# Error: F[ItemModel].field found where F[UserModel].field expected
id: str = F[ItemModel].field(factory = lamda item: item.id)
# Error: no field "price" found for user: UserModel
name: str = F[UserModel].field(factory = lamda user: user.price)
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
Beginne damit, die in Issue #14293 referenzierte bestehende PEP-681-Unterstützung von mypy zu überprüfen und das verlinkte mypy-playground-Beispiel zu reproduzieren. Untersuche anschließend anhand der Beispiele in diesem Issue als Akzeptanzfälle, wie dataclass_transform statische Methoden, Generic-Methoden und field_specifiers behandelt. Als abgeschlossen gilt die Aufgabe, wenn die Abweichungen beim Decorator und bei den Feldtypen wie beschrieben diagnostiziert werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100