मैं कुछ आधार लिखने के लिए अमूर्त आधार कक्षाओं के साथ पायथन के प्रकार एनोटेशन की कोशिश कर रहा हूं। क्या संभव प्रकारों को एनोटेट करने का एक तरीका है *argsऔर **kwargs?
उदाहरण के लिए, कोई कैसे व्यक्त करेगा कि एक फ़ंक्शन के लिए समझदार तर्क intया तो एक या दो intएस हैं? type(args)देता है Tupleतो मेरा अनुमान है के रूप में प्रकार व्याख्या करने के लिए था Union[Tuple[int, int], Tuple[int]], लेकिन यह काम नहीं करता।
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))
मैपी से त्रुटि संदेश:
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]]"
यह समझ में आता है कि mypy को फंक्शन कॉल के लिए यह पसंद नहीं है क्योंकि यह उम्मीद करता tupleहै कि कॉल में ही ऐसा हो। इसके अलावा unpacking भी एक टाइपिंग त्रुटि देता है जो मुझे समझ में नहीं आता है।
कैसे *argsऔर के लिए समझदार प्रकार एनोटेट करता है **kwargs?
Optional? क्या पायथन के बारे में कुछ बदल गया या आपने अपना दिमाग बदल दिया? क्याNoneडिफ़ॉल्ट के कारण यह अभी भी सख्ती से आवश्यक नहीं है ?