मैं कुछ आधार लिखने के लिए अमूर्त आधार कक्षाओं के साथ पायथन के प्रकार एनोटेशन की कोशिश कर रहा हूं। क्या संभव प्रकारों को एनोटेट करने का एक तरीका है *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
डिफ़ॉल्ट के कारण यह अभी भी सख्ती से आवश्यक नहीं है ?