confusing type error when using overloads
オープン
まだ誰も着手していません。
bug
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
Bug Report
when using overloads, the type errors for mistakes are confusingly hidden
https://mypy-play.net/?mypy=latest&python=3.11&gist=bd18c94e9aa3e0eb5bbd58d670a1f166
from __future__ import annotations
from typing import overload, Callable, TypeVar
import subprocess
import logging
log = logging.getLogger(__name__)
PARSE_RESULT= TypeVar("PARSE_RESULT")
T = TypeVar("T")
@overload
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: None = None,
error_msg: str | None = None,
) -> PARSE_RESULT | None:
...
@overload
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: T,
error_msg: str | None = None,
) -> PARSE_RESULT | T:
...
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: T | None = None,
error_msg: str | None = None,
) -> PARSE_RESULT | T | None:
if res.returncode:
if error_msg:
log.warning("%s %s", error_msg, res)
return default
else:
return parse(res.stdout)
def parse_other(
res: subprocess.CompletedProcess[str]) -> str:
return res.stdout
example = subprocess.CompletedProcess("example", 0, "wrong", "ignored")
def myparse(data: str) -> int|None:
try:
return int(data)
except Exception: #diaper
return None
parse_success((example,), parse=myparse, error_msg=":)")
parse_other((example,))
Expected Behavior
main.py:65: error: Argument 1 to "parse_success" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
main.py:68: error: Argument 1 to "parse_other" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Actual Behavior
main.py:65: error: No overload variant of "parse_success" matches argument types "Tuple[CompletedProcess[str]]", "Callable[[str], Optional[int]]", "str" [call-overload]
main.py:65: note: Possible overload variants:
main.py:65: note: def [PARSE_RESULT] parse_success(res: CompletedProcess[str], *, parse: Callable[[str], PARSE_RESULT], default: None = ..., error_msg: Optional[str] = ...) -> Optional[PARSE_RESULT]
main.py:65: note: def [PARSE_RESULT, T] parse_success(res: CompletedProcess[str], *, parse: Callable[[str], PARSE_RESULT], default: T, error_msg: Optional[str] = ...) -> Union[PARSE_RESULT, T]
main.py:68: error: Argument 1 to "parse_other" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
replicated this in the playground on 1.1.1
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、リンクされている mypy-play の再現を実行し、main.py の 65 行目の overload 呼び出しと 68 行目の parse_other を比較します。overload 解決がどのように診断を選択するかを追跡します。誤った引数が直接的な型不一致メッセージで報告され、同時に実際の不一致に対する有用な overload エラーが維持されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 38/100