Dataclasses: `No overload variant of "asdict" matches argument type "Self" [call-overload]` when deciding decorator conditionally
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 42/100
Hướng nghiên cứu
Chạy ví dụ Python 3.12 được cung cấp với mypy 1.10.0 và --show-error-context --strict để tái hiện các lỗi đối với dataclasses.asdict và dataclasses.replace. Trước tiên, hãy lần theo cách xử lý trình trang trí dataclass có điều kiện, Self và các kiểm tra overload và type-variable được báo cáo. Công việc được xem là hoàn tất khi ví dụ vượt qua kiểm tra kiểu mà không có các dương tính giả này, đồng thời vẫn giữ nguyên hành vi khi chạy.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Bug Report
Mypy raises a false positive for dataclass.asdict (No overload variant of "asdict" matches argument type "Self" [call-overload]) on the very specific circumstances:
- The specific decorator for
dataclassis decided based on a condition (e.g. Python version) - The
datalcasses.asdictmethod is called from a method that uses PEP 673's Self Type.
I also noted a similar problem occurs for dataclasses.replace: Value of type variable "_DataclassT" of "replace" cannot be "Self" [type-var].
To Reproduce
import sys
import dataclasses
import json
from typing import Self
if sys.version_info >= (3, 10):
dataclass = dataclasses.dataclass(kw_only=True)
else:
dataclass = dataclasses.dataclass
@dataclass
class HelloWorld:
a: int = 1
b: int = 2
c: int = 3
def double(self) -> Self:
fields = dataclasses.asdict(self)
return self.__class__(**{k: v*2 for k, v in fields.items()})
def json_overwrite(self, text: str) -> Self:
new = json.loads(text)
return dataclasses.replace(self, **new)
x = HelloWorld().double()
y = HelloWorld().json_overwrite('{"c": 42}')
assert x.b == 4
assert y.c == 42
print(f"{x=}")
print(f"{y=}")
Gist URL: https://gist.github.com/mypy-play/70b801fbe15391f0750be8f6c403fdf4
Playground URL: https://mypy-play.net/?mypy=latest&python=3.12&flags=show-error-context%2Cstrict&gist=70b801fbe15391f0750be8f6c403fdf4
Expected Behavior
There should be no false negative.
The program works fine in runtime:
$ python3.12 main.py
x=HelloWorld(a=2, b=4, c=6)
y=HelloWorld(a=1, b=2, c=42)
Actual Behavior
main.py: note: In member "double" of class "HelloWorld":
main.py:19: error: No overload variant of "asdict" matches argument type "Self" [call-overload]
main.py:19: note: Possible overload variants:
main.py:19: note: def asdict(obj: DataclassInstance) -> dict[str, Any]
main.py:19: note: def [_T] asdict(obj: DataclassInstance, *, dict_factory: Callable[[list[tuple[str, Any]]], _T]) -> _T
main.py: note: In member "json_overwrite" of class "HelloWorld":
main.py:24: error: Value of type variable "_DataclassT" of "replace" cannot be "Self" [type-var]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 1.10.0
- Mypy command-line flags:
--show-error-context,--strict - Mypy configuration options from
mypy.ini(and other config files): - Python version used: 3.12
- Ngôn ngữ chính
- Python
- Star
- 20.6k
- Fork
- 3.3k
- Merge trung bình
- 1 ngày 18 giờ
- Pull request đã merge (30 ngày)
- 54
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.
Issue khác của python/mypy
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
bug topic-configuration topic-error-reporting
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
qgis/QGIS-Documentation#11275 ·
-
bug priority:normal ready-for-dev
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
OpenHands/extensions#626 · 1 bình luận ·
-
Change observation tooltip text Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
CSCfi/sd-search-api#39 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
-
please add to porn list Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
StevenBlack/hosts#3255 ·