Wrong errors of type unsupported operand when type checking is done in list
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproduce el fragmento de coordinate_magic/test.py con mypy 1.8.0 y compara después la forma None in (a, b) con la forma is None. Inspecciona el recorrido de comprobación de tipos para el estrechamiento basado en pertenencia; se considera terminado cuando la resta válida ya no produce errores unsupported-operand y la regresión está cubierta por una prueba.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100