Ich probiere Pythons Typanmerkungen mit abstrakten Basisklassen aus, um einige Schnittstellen zu schreiben. Gibt es eine Möglichkeit, die möglichen Arten von *args
und mit Anmerkungen zu versehen **kwargs
?
Wie würde man zum Beispiel ausdrücken, dass die sinnvollen Argumente für eine Funktion entweder ein int
oder zwei int
s sind? type(args)
gibt Tuple
so meine Vermutung , die Art , wie mit Anmerkungen versehen war Union[Tuple[int, int], Tuple[int]]
nicht, aber das funktioniert nicht.
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))
Fehlermeldungen von 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]]"
Es ist sinnvoll, dass mypy dies für den Funktionsaufruf nicht mag, da erwartet wird, dass tuple
im Aufruf selbst ein a vorhanden ist. Das Hinzufügen nach dem Auspacken führt auch zu einem Tippfehler, den ich nicht verstehe.
Wie kommentiert man die sinnvollen Typen für *args
und **kwargs
?
Optional
? Hat sich etwas an Python geändert oder haben Sie Ihre Meinung geändert? Ist es aufgrund derNone
Standardeinstellung immer noch nicht unbedingt erforderlich ?