confusing behavior with TypeVars and multiple inheritance checks in 0.770
Chưa có ai nhận issue này.
- 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ả
Hi, I was just testing out 0.770 and I'm getting a surprising result:
from typing import TypeVar
class Foo(object):
pass
FooOrStr = TypeVar('FooOrStr', Foo, str)
def doit(reset: bool, arg: FooOrStr) -> FooOrStr:
if reset:
if isinstance(arg, Foo):
reveal_type(arg)
arg = Foo()
elif isinstance(arg, str):
reveal_type(arg)
arg = ''
else:
raise TypeError()
return arg
test.py:12: note: Revealed type is 'test.Foo*'
test.py:12: note: Revealed type is 'test.<subclass of "str" and "Foo">'
test.py:13: error: Incompatible types in assignment (expression has type "Foo", variable has type "str") [assignment]
test.py:15: note: Revealed type is 'builtins.str*'
Based on the latest blog post about 0.770 I suspect this is by design, but what can I do to work around it (short of adding some artificial method to make Foo incompatible with str)?
It would be good to add something to the docs about this, because I think it could be a fairly common trap. Also, I think adjusting the error message to clarify the relationship to multiple inheritance would help, e.g. variable has type Foo and 'test.<subclass of "str" and "Foo">'.
Thanks!
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 mypy 0.770 hoặc ví dụ về TypeVar và đa kế thừa trong issue để tái hiện các kiểu được hiển thị và lỗi gán. Đọc tài liệu liên quan về TypeVar và thu hẹp kiểu, cùng với các bài kiểm thử chẩn đoán, sau đó ghi lại hành vi, một cách khắc phục tạm thời và cách diễn đạt rõ ràng hơn về mối quan hệ giữa Foo và kiểu lớp con được suy luận.
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
- devtools, tooling
- Loại issue
- Tài liệu
- Độ 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
- 30/100