isinstance check widens type
Đang mở
Chưa có ai nhận issue này.
bug
topic-type-narrowing
- 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ả
- 2025-02-14: reproduced using mypy 1.15 and python 3.13 mypy-playground
- 2023-02-14: reproduced using mypy 1.0 and python 3.11 mypy-playground
from collections.abc import Collection, Mapping
def f(x: int | Collection[int] | Mapping[str, int]) -> int:
r"""Recursively sum up all the values of possibly nested data."""
if isinstance(x, int):
return x
if isinstance(x, Mapping):
return sum(f(y) for y in x.values())
reveal_type(x) # <- Here, mypy thinks this is Collection only!
if isinstance(x, Collection):
reveal_type(x) # <- Suddenly mypy thinks this is Collection | Mapping
return sum(f(y) for y in x) # ❌ "f" has incompatible type "int | str"
raise TypeError(f"unsupported type: {type(x)}")
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- 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 reproducer được cung cấp trong các ví dụ mypy-playground được liên kết, với các phiên bản mypy và Python được liệt kê, sau đó theo dõi cách các kiểm tra isinstance thu hẹp x sau nhánh Mapping. Được xem là hoàn tất khi nhánh Collection thu hẹp x một cách nhất quán và lời gọi f được minh họa vượt qua kiểm tra kiểu mà không có lỗi int | str không tương thích.
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, devtools
- 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
- 35/100