Wrong errors of type unsupported operand when type checking is done in list
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
(A clear and concise description of what the bug is.)
To Reproduce
a: None | float = 0.0
b: None | float = 0.0
c = None if None in (a, b) else a - b
print(c)
(Also the alternative approach of using a regular if...else... block fails)
Expected Behavior
No error found by mypy. I cannot think of a way that this code fails. But maybe I'm just very code-blind right now.
Actual Behavior
coordinate_magic/test.py:4: error: Unsupported left operand type for - ("None") [operator]
coordinate_magic/test.py:4: error: Unsupported operand types for - ("None" and "float") [operator]
coordinate_magic/test.py:4: error: Unsupported operand types for - ("float" and "None") [operator]
coordinate_magic/test.py:4: note: Both left and right operands are unions
Found 3 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used:
mypy 1.8.0 (compiled: yes) - Mypy command-line flags: None
- Mypy configuration options from
mypy.ini(and other config files):pyproject.toml[tool.mypy] # Config for 'mypy' # See https://mypy.readthedocs.io/en/stable/config_file.html#using-a-pyproject-toml-file for more details python_version = "3.11" plugins = "numpy.typing.mypy_plugin" warn_return_any = true warn_unused_configs = true allow_redefinition = true # Allows variables to be redefined with an arbitrary type, as long as the redefinition is in the same block and nesting level as the original definition. disallow_untyped_defs = true disallow_incomplete_defs = true # Disallows defining functions with incomplete type annotations. check_untyped_defs = true # Type-checks the interior of functions without type annotations. no_implicit_optional = true # Changes the treatment of arguments with a default value of None by not implicitly making their type Optional. show_error_codes = true exclude = "gui/|doc/|coordinate.py" [[tool.mypy.overrides]] # mypy per-module options module = [ "scipy", "scipy.*", "mpl_toolkits.mplot3d", "altair", # Remove when issue https://github.com/altair-viz/altair/issues/2493 is solved "folium", # Remove when issue https://github.com/python-visualization/folium/issues/1559 is solved "folium.plugins", "matplotlib", # Remove when issue https://github.com/matplotlib/matplotlib/issues/20504 is solved "matplotlib.*", "traffic", "coloredlogs", # Remove when issue https://github.com/xolox/python-coloredlogs/issues/93 is solved "pymap3d", # Remove when discussion https://github.com/geospace-code/pymap3d/pull/76 is solved ] ignore_missing_imports = true - Python version used:
3.11
The problem lies in the if None in (a, b) part.
As soon as code is changed to
a: None | float = 0.0
b: None | float = 0.0
c = None if a is None or b is None else a - b
print(c)
mypy does not report an error.
EDIT: Added a playground link with all examples
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 das Snippet aus coordinate_magic/test.py mit mypy 1.8.0 und vergleiche anschließend die Form None in (a, b) mit der Form is None. Untersuche den Typprüfungsweg für die auf Mitgliedschaft basierende Eingrenzung; abgeschlossen ist die Arbeit, wenn die gültige Subtraktion keine unsupported-operand-Fehler mehr erzeugt und die Regression durch einen Test abgedeckt ist.
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
- 42/100