python / python/mypy

[1.20 regression] _Environ.get(key, default) returns str | None when default is an alias to Any

Aperta
#21,344 5 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Since mypy 1.20, passing a value whose type is an alias to Any (e.g. Incomplete: TypeAlias = Any) as the default argument of os.environ.get causes mypy to infer str | None instead of Any, producing a spurious [arg-type] error at the use site.

Reproducer: https://mypy-play.net/?gist=7a79f64ac9733542b571cc358f6d3165

import os
from pathlib import Path
from typing import Any
from typing_extensions import TypeAlias

Incomplete: TypeAlias = Any

A: Incomplete = Path()
reveal_type(A)               # Any  (good)

B = os.environ.get('TEST', A)
reveal_type(B)               # str | None  (bad)  (expected: Any)

C = Path(B)                  # error: Argument 1 to "Path" has incompatible
                             # type "str | None"; expected "str | PathLike[str]"

Bisected to 30260ca57 which added explicit _Environ.get/pop overloads where the first overload is def get(self, key, default: None = None) -> AnyStr | None. Before that sync, _Environ inherited Mapping.get, whose first overload took no default argument, so 2-arg calls couldn't match it.

Versions: broken on mypy ≥ 1.20.0; works on mypy ≤ 1.19.1.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia dagli overload espliciti di _Environ.get e pop introdotti dal commit 30260ca57 e riproduci il problema con l’esempio mypy-play collegato. Confronta il comportamento con mypy 1.20 e 1.19.1, quindi verifica che un alias di Any passato come valore predefinito venga inferito come Any e che non si verifichi alcun errore [arg-type] spurio.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
devtools
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
68/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.