Wrong errors of type unsupported operand when type checking is done in list
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
coordinate_magic/test.py のスニペットを mypy 1.8.0 で再現し、その後 None in (a, b) の形式と is None の形式を比較してください。メンバーシップに基づく narrowing の型チェック経路を調査してください。完了条件は、有効な減算で unsupported-operand エラーが発生しなくなり、回帰がテストでカバーされていることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 42/100