How to alias `Annotated` to a subscriptable type
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 20/100
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.
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.
- Ngôn ngữ chính
- Python
- Star
- 1.8k
- Fork
- 302
- Merge trung bình
- 23 giờ
- Pull request đã merge (30 ngày)
- 8
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.
Issue khác của python/typing
-
topic: typing spec
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
topic: typing spec
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
topic: documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
topic: documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
topic: conformance tests topic: typing spec
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 72/100
Tất cả issue của python/typing
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 90/100
learningequality/ricecooker#747 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
BSData/horus-heresy-3rd-edition#3171 ·
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
run-llama/llama_index#23199 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
KhronosGroup/glTF-Blender-IO#2769 ·