Saya mencoba anotasi tipe Python dengan kelas dasar abstrak untuk menulis beberapa antarmuka. Apakah ada cara untuk menjelaskan jenis *argsdan kemungkinan **kwargs?
Sebagai contoh, bagaimana seseorang menyatakan bahwa argumen yang masuk akal untuk suatu fungsi adalah satu intatau dua int? type(args)memberi Tuplejadi dugaan saya adalah untuk membubuhi keterangan jenis Union[Tuple[int, int], Tuple[int]], tetapi ini tidak berhasil.
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))
Pesan kesalahan dari 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]]"
Masuk akal bahwa mypy tidak menyukai ini untuk pemanggilan fungsi karena ia mengharapkan akan ada tupledalam pemanggilan itu sendiri. Tambahan setelah membongkar juga memberikan kesalahan pengetikan yang saya tidak mengerti.
Bagaimana cara menjelaskan jenis yang masuk akal untuk *argsdan **kwargs?
Optional? Apakah ada yang berubah tentang Python atau Anda berubah pikiran? Apakah masih belum sepenuhnya diperlukan karenaNonedefault?