Tôi đang thử các chú thích kiểu Python với các lớp cơ sở trừu tượng để viết một số giao diện. Có cách nào để chú thích các loại có thể *args
và **kwargs
?
Ví dụ, làm thế nào một người có thể diễn tả rằng các đối số hợp lý cho một hàm là một int
hoặc hai int
s? type(args)
đưa ra Tuple
dự đoán của tôi là chú thích loại như Union[Tuple[int, int], Tuple[int]]
, nhưng điều này không hoạt động.
from typing import Union, Tuple
def foo(*args: Union[Tuple[int, int], Tuple[int]]):
try:
i, j = args
return i + j
except ValueError:
assert len(args) == 1
i = args[0]
return i
# ok
print(foo((1,)))
print(foo((1, 2)))
# mypy does not like this
print(foo(1))
print(foo(1, 2))
Thông báo lỗi từ mypy:
t.py: note: In function "foo":
t.py:6: error: Unsupported operand types for + ("tuple" and "Union[Tuple[int, int], Tuple[int]]")
t.py: note: At top level:
t.py:12: error: Argument 1 to "foo" has incompatible type "int"; expected "Union[Tuple[int, int], Tuple[int]]"
t.py:14: error: Argument 1 to "foo" has incompatible type "int"; expected "Union[Tuple[int, int], Tuple[int]]"
t.py:15: error: Argument 1 to "foo" has incompatible type "int"; expected "Union[Tuple[int, int], Tuple[int]]"
t.py:15: error: Argument 2 to "foo" has incompatible type "int"; expected "Union[Tuple[int, int], Tuple[int]]"
Điều này có nghĩa là mypy không thích điều này đối với lệnh gọi hàm vì nó hy vọng sẽ có một tuple
cuộc gọi trong chính nó. Việc bổ sung sau khi giải nén cũng gây ra lỗi đánh máy mà tôi không hiểu.
Làm thế nào để một chú thích các loại hợp lý cho *args
và **kwargs
?
Optional
? Có điều gì đó thay đổi về Python hoặc bạn đã thay đổi suy nghĩ của mình? Nó vẫn không thực sự cần thiết doNone
mặc định?