Type refinements are not applied to index expressions
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Ran into this issue today, I believe mypy is incorrectly flagging this as an error:
from typing import Any, Dict, Optional
def rename_keys(
original_dict: Dict[str, Any], key_mapping: Dict[str, Optional[str]]
) -> Dict[str, Any]:
"""Renames keys in the dictionary using the key_mapping. If the value in key_mapping is None then it will remove the key entirely"""
return {
key_mapping.get(k, k): v
for k, v in original_dict.items()
if k not in key_mapping or key_mapping[k] is not None
}
output from mypy:
/tmp/mypytest.py:8: error: Key expression in dictionary comprehension has incompatible type "Optional[str]"; expected type "str"
if key_mapping.get(k) is None then it would fail the if-statement at the end of the dictionary comprehension and therefore get filtered out
if k is not in key_mapping then k is the result of the expression key_mapping.get(k,k). k can't be None because k comes from the keys of original_dict which has the type Dict[str, Any]
Versions: mypy 0.701, Python 3.7.4
no flags
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
Reproduziere den Bericht mit der gezeigten rename_keys-Wörterbuchkomprehension unter Verwendung von mypy 0.701 und Python 3.7.4. Verfolge nach, wie Typverfeinerungen für die if-Bedingung und den indizierten Zugriff behandelt werden, und überprüfe anschließend, dass die inkompatible Optional[str]-Diagnose behoben wird, ohne den None-Fall zuzulassen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100