Wrong errors of type unsupported operand when type checking is done in list
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez l’extrait de coordinate_magic/test.py avec mypy 1.8.0, puis comparez la forme None in (a, b) avec la forme is None. Examinez le chemin de vérification des types pour le narrowing basé sur l’appartenance ; le travail est terminé lorsque la soustraction valide ne produit plus d’erreurs unsupported-operand et que la régression est couverte par un test.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 42/100