Callable with variadic fixed arguments that doesn't mean *args
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ả
Suppose I have a type of function called CommandHandler, that is a function that receives a command as its first parameter but then could have other parameters.
Examples
class Command:
pass
class RegisterUser(Command):
pass
class DeleteUser(Command):
pass
def register_user(command: RegisterUser, db : Db) -> None:
...
def delete_user(command: DeleteUser, dispatch: EventDispatcher, cache: Cache) -> None:
...
mappings : dict[Command, CommandHandler] = {
RegisterUser: register_user,
DeleteUser: delete_user
}
What would be the definition of CommandHandler?
Ideally it would be:
C= TypeVar("C", bound=Command)
CommandHandler = Callable[[C, ...], None]
But this syntax is not possible.
I've found in the documentation that Concatenate could receive ... at the end,
Concatenate is currently only valid when used as the first argument to a Callable. The last parameter to Concatenate must be a ParamSpec or ellipsis (...).
so it could be:
C= TypeVar("C", bound=Command)
CommandHandler = Callable[Concatenate[C, ...], None]
But this returns an error from Pylance:

One could say Callback Protocol could solve this like:
C= TypeVar("C", bound=Command)
class CommandHandler(Protocol):
def __call__(self, __command: C, *__args: Any) -> None: ...
But it only receives functions that has an implicit variadic argument, it doesn't work with variadic forms of the function.
So far the only way I could solve this is through the Union of many Callables, but it doesn't look like the best solution.
At the end CommandHandler can only be defined as:
C= TypeVar("C", bound=Command)
CommandHandler = Union[
Callable[[C, Any], None],
Callable[[C, Any, Any], None],
Callable[[C, Any, Any, Any], None],
Callable[[C, Any, Any, Any, Any], None],
Callable[[C, Any, Any, Any, Any, Any], None],
Callable[[C, Any, Any, Any, Any, Any, Any], None],
Callable[[C, Any, Any, Any, Any, Any, Any, Any], None],
Callable[
[C, Any, Any, Any, Any, Any, Any, Any, Any], None
],
]
Related:
https://github.com/python/cpython/issues/88954
https://stackoverflow.com/questions/57658879/python-type-hint-for-callable-with-variable-number-of-str-same-type-arguments
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 tài liệu về Callable và Concatenate được mô tả trong issue, sau đó xem xét issue liên quan 88954 và cuộc thảo luận Stack Overflow được liên kết. So sánh các dạng CommandHandler được yêu cầu với các quy tắc typing hiện tại và xác định liệu một thiết kế được hỗ trợ có thể biểu diễn chúng hay không; phần hoàn tất phải bao gồm một đặc tả đã được thống nhất và kế hoạch tương ứng về tài liệu hoặc triển khai.
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
- 30/100