Dataclasses: `No overload variant of "asdict" matches argument type "Self" [call-overload]` when deciding decorator conditionally
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Bug Report
Mypy raises a false positive for dataclass.asdict (No overload variant of "asdict" matches argument type "Self" [call-overload]) on the very specific circumstances:
- The specific decorator for
dataclassis decided based on a condition (e.g. Python version) - The
datalcasses.asdictmethod is called from a method that uses PEP 673's Self Type.
I also noted a similar problem occurs for dataclasses.replace: Value of type variable "_DataclassT" of "replace" cannot be "Self" [type-var].
To Reproduce
import sys
import dataclasses
import json
from typing import Self
if sys.version_info >= (3, 10):
dataclass = dataclasses.dataclass(kw_only=True)
else:
dataclass = dataclasses.dataclass
@dataclass
class HelloWorld:
a: int = 1
b: int = 2
c: int = 3
def double(self) -> Self:
fields = dataclasses.asdict(self)
return self.__class__(**{k: v*2 for k, v in fields.items()})
def json_overwrite(self, text: str) -> Self:
new = json.loads(text)
return dataclasses.replace(self, **new)
x = HelloWorld().double()
y = HelloWorld().json_overwrite('{"c": 42}')
assert x.b == 4
assert y.c == 42
print(f"{x=}")
print(f"{y=}")
Gist URL: https://gist.github.com/mypy-play/70b801fbe15391f0750be8f6c403fdf4
Playground URL: https://mypy-play.net/?mypy=latest&python=3.12&flags=show-error-context%2Cstrict&gist=70b801fbe15391f0750be8f6c403fdf4
Expected Behavior
There should be no false negative.
The program works fine in runtime:
$ python3.12 main.py
x=HelloWorld(a=2, b=4, c=6)
y=HelloWorld(a=1, b=2, c=42)
Actual Behavior
main.py: note: In member "double" of class "HelloWorld":
main.py:19: error: No overload variant of "asdict" matches argument type "Self" [call-overload]
main.py:19: note: Possible overload variants:
main.py:19: note: def asdict(obj: DataclassInstance) -> dict[str, Any]
main.py:19: note: def [_T] asdict(obj: DataclassInstance, *, dict_factory: Callable[[list[tuple[str, Any]]], _T]) -> _T
main.py: note: In member "json_overwrite" of class "HelloWorld":
main.py:24: error: Value of type variable "_DataclassT" of "replace" cannot be "Self" [type-var]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 1.10.0
- Mypy command-line flags:
--show-error-context,--strict - Mypy configuration options from
mypy.ini(and other config files): - Python version used: 3.12
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Esegui l’esempio fornito in Python 3.12 con mypy 1.10.0 e --show-error-context --strict per riprodurre gli errori relativi a dataclasses.asdict e dataclasses.replace. Inizia tracciando la gestione del decoratore dataclass condizionale, di Self e dei controlli segnalati di overload e variabile di tipo. Il lavoro è completato quando l’esempio supera il controllo dei tipi senza questi falsi positivi, preservando il comportamento a runtime.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- devtools
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 42/100