How to alias `Annotated` to a subscriptable type
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ả
Hi, I want to create a type alias that simply wraps a tuple into Annotated.
I want to be able to write
SpecialReturn[int, bool, str]
And get
Annotated[Tuple[int, bool, str], 'special return!']
Among other things, I've tried:
class SpecialReturn():
def __class_getitem__(self, params: Tuple[Any, ...]) -> Tuple[Any, ...]:
return typing.cast(
Tuple[Any, ...],
_typing.Annotated[
typing.Tuple.__getitem__(params),
'multiple_return',
]
)
Which mypy is happy with the declaration, but not using it:
import typing
from typing import Annotated, Any, Tuple
class SpecialReturn():
def __class_getitem__(self, params: Tuple[Any, ...]) -> Tuple[Any, ...]:
return typing.cast(
Tuple[Any, ...],
Annotated[
typing.Tuple.__getitem__(params),
'multiple_return',
]
)
def test() -> SpecialReturn[int, int]:
return 1, 2
test8.py:17: error: "SpecialReturn" expects no type arguments, but 2 given
test8.py:18: error: Incompatible return value type (got "Tuple[int, int]", expected "SpecialReturn")
Which happens because I guess mypy does not evaluate the type annotation, it just treats SpecialReturn as a separate type. I am not sure what is the reasoning behind this, but I assume there it makes sense in some way(?).
So, is there any alternative? How do achieve this? I essentially want to alias Tuple and be able to find out at runtime if the type is a normal tuple or my special one.
My first jab at this, and what I think makes most sense to a Python developer is the following
from typing import Tuple
class SpecialReturn(Tuple):
pass
def test() -> SpecialReturn[int, int]:
return 1, 2
But mypy can't handle it either:
test.py:4: error: Missing type parameters for generic type "Tuple"
test.py:8: error: "SpecialReturn" expects no type arguments, but 2 given
test.py:9: error: Incompatible return value type (got "Tuple[int, int]", expected "SpecialReturn")
I was thinking maybe something like this was possible with Annotated, but it seems not.
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 bằng cách đọc PEP 593 và các ví dụ trong issue này, sau đó xem xét cách typing project biểu diễn Annotated, các bí danh generic và class_getitem. Issue không nêu tên tệp, bài kiểm thử hay điểm vào triển khai nào, và để hoàn tất cần xác định liệu hành vi này có nên được hỗ trợ hay không cũng như nên đặc tả nó như thế nào.
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
- 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
- Cần làm rõ
- Mức phù hợp với người mới
- 20/100