python / python/mypy

confusing type error when using overloads

Đang mở
#14,976 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

bug
Ngôn ngữ chính
Python
Star
20.6k
Fork
3.3k
Chỉ số merge pull request
Chỉ số pull request đang chờ

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu bằng cách chạy bản tái hiện mypy-play được liên kết và so sánh lệnh gọi overload ở dòng 65 của main.py với parse_other ở dòng 68. Theo dõi cách quá trình phân giải overload chọn các chẩn đoán; hoàn tất khi đối số không chính xác được báo cáo bằng thông báo trực tiếp về kiểu không tương thích, đồng thời vẫn giữ lại các lỗi overload hữu ích cho những trường hợp không khớp thực sự.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
compilers
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
38/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.