[Regression 1.19.1 -> 1.20.0] `value in container` based narrowing causes false negatives.
Aperta
Nessuno ha ancora preso questa issue.
bug
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Merge medio
- 1g 18h
- PR unite (30g)
- 54
Descrizione
mypy seems to narrow the type of value in a if value in container branch, which leads to false negatives.
class Size(tuple[int, ...]):
def numel(self) -> int:
return 0 # math.prod(self)
sizes: list[Size] = [Size([1, 2, 3])]
print(sizes[0].numel()) # OK
value = (1, 2, 3)
if value in sizes:
reveal_type(value) # mypy: Size; pyright, ty, zuban, pyrefly: tuple
print(value.numel()) # ERROR at runtime
- with 1.19.1,
mypyrevealstuple[int, int, int]and correctly errors. https://mypy-play.net/?mypy=1.19.1&python=3.12&gist=12a961d6aab6b40ee13d895ab9ce037b - with 1.20.0 onwards,
mypyrevealsSizeand produces a false negative. https://mypy-play.net/?mypy=1.20.0&python=3.12&gist=76665c3096babff2c683164fdae02dbc
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
Inizia riproducendo la differenza di narrowing nell'esempio mypy-play collegato con le versioni 1.19.1 e 1.20.0, quindi traccia la gestione di value in sizes e del tipo rivelato. Aggiungi un test di regressione per l'esempio con Size e la tupla e conferma che mypy mantenga il tipo della tupla e segnali la chiamata non valida a numel().
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers, tooling
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 55/100