ฉันกำลังลองใช้คำอธิบายประกอบชนิดของ Python พร้อมคลาสเบสที่เป็นนามธรรมเพื่อเขียนอินเตอร์เฟส มีวิธีการอธิบายประเภทที่เป็นไปได้*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))
ข้อความแสดงข้อผิดพลาดจาก 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]]"
มันสมเหตุสมผลแล้วที่ mypy ไม่ชอบสิ่งนี้สำหรับการเรียกฟังก์ชั่นเพราะมันคาดว่าจะมีtuple
การเรียกในตัวมันเอง การเพิ่มหลังจากแกะออกมาแล้วยังทำให้เกิดข้อผิดพลาดในการพิมพ์ที่ฉันไม่เข้าใจ
หนึ่งคนอธิบายชนิดที่เหมาะสมสำหรับ*args
และ**kwargs
อย่างไร
Optional
? มีอะไรเปลี่ยนแปลงเกี่ยวกับ Python หรือคุณเปลี่ยนใจหรือเปล่า? มันยังไม่จำเป็นอย่างเคร่งครัดเนื่องจากNone
ค่าเริ่มต้นหรือไม่