python / python/mypy

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

Offen
#21,344 5 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den expliziten _Environ.get- und pop-Überladungen, die durch Commit 30260ca57 eingeführt wurden, und reproduziere das Problem mit dem verknüpften mypy-play-Beispiel. Vergleiche das Verhalten mit mypy 1.20 und 1.19.1 und überprüfe anschließend, dass ein als Default übergebener Alias für Any als Any inferiert wird und kein überflüssiger [arg-type]-Fehler auftritt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
68/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.