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ể *argsvà **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 inthoặc hai ints? type(args)đưa ra Tupledự đ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 tuplecuộ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 *argsvà **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 doNonemặc định?