Allow `NotRequired[]` to be passed as a `TypeVar`
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 1.8k
- Fork
- 302
- Merge trung bình
- 23 giờ
- Pull request đã merge (30 ngày)
- 8
Mô tả
I just found myself wanting to do the following:
from typing import TypedDict, NotRequired, Generic, TypeVar, Union, Never
_T = TypeVar('_T')
Foo = Union['FooSub1[_T]', 'FooSub2[_T]', 'FooSub3[_T]']
class BaseFoo(TypedDict, Generic[_T]):
bar: _T
class FooSub1(BaseFoo[_T]):
sub1: str
class FooSub2(BaseFoo[_T]):
sub2: str
class FooSub3(BaseFoo[_T]):
sub3: str
def foo(foo_with_bar: Foo[int]):
reveal_type(foo_with_bar) # Type of "foo_with_bar" is "FooSub1[int] | FooSub2[int] | FooSub3[int]"
def bar(foo_without_bar: Foo[NotRequired[Never]]): # error: "NotRequired" is not allowed in this context
pass
Mypy and Pyright both disallow NotRequired to be passed as a TypeVar. However the only way to avoid doing that would require me to duplicate all subclass definitions, which I am not willing to do because I have more than a dozen and so much duplication would make the code less maintainable.
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
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 với reproducer trong issue và so sánh các quy tắc hiện tại của NotRequired và TypeVar trong mypy và Pyright, hai checker được nêu trong báo cáo. Không có tệp hoặc bài kiểm thử nào được xác định; công việc chỉ được hoàn thành khi có thiết kế quy tắc kiểu được thống nhất và hành vi tương ứng của checker, mà không nhân đôi các lớp con TypedDict.
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
- tooling
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- 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