Saya mencoba anotasi tipe Python dengan kelas dasar abstrak untuk menulis beberapa antarmuka. Apakah ada cara untuk menjelaskan jenis *args
dan kemungkinan **kwargs
?
Sebagai contoh, bagaimana seseorang menyatakan bahwa argumen yang masuk akal untuk suatu fungsi adalah satu int
atau dua int
? type(args)
memberi Tuple
jadi 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 tuple
dalam pemanggilan itu sendiri. Tambahan setelah membongkar juga memberikan kesalahan pengetikan yang saya tidak mengerti.
Bagaimana cara menjelaskan jenis yang masuk akal untuk *args
dan **kwargs
?
Optional
? Apakah ada yang berubah tentang Python atau Anda berubah pikiran? Apakah masih belum sepenuhnya diperlukan karenaNone
default?