Python automatycznie rozpakowuje *args i **kwargs do odpowiednich pozycji w sygnaturze funkcji. Jeśli po tym rozpakowaniu okaże się, że funkcja nie ma odpowiednich parametrów, wtedy zostanie zgłoszony błąd TypeError. Przyjrzyjmy się temu bliżej.
-
Rozpakowywanie
*args*argspozwala funkcji przyjmować dowolną liczbę argumentów pozycyjnych. Te argumenty są przekazywane jako krotka.def example_func(a, b, *args): print("a:", a) print("b:", b) print("args:", args) example_func(1, 2, 3, 4)
Python automatycznie rozpakowuje
3i4do krotkiargs:a: 1 b: 2 args: (3, 4) -
Rozpakowywanie
**kwargs**kwargspozwala funkcji przyjmować dowolną liczbę argumentów nazwanych. Te argumenty są przekazywane jako słownik.def example_func(a, b, **kwargs): print("a:", a) print("b:", b) print("kwargs:", kwargs) example_func(1, 2, c=3, d=4)
Python automatycznie rozpakowuje
c=3id=4do słownikakwargs:a: 1 b: 2 kwargs: {'c': 3, 'd': 4} -
Rozpakowywanie
*argsi**kwargsjednocześniedef example_func(a, b, *args, **kwargs): print("a:", a) print("b:", b) print("args:", args) print("kwargs:", kwargs) example_func(1, 2, 3, 4, c=5, d=6)
Python rozpakowuje
3i4do krotkiargs, orazc=5id=6do słownikakwargs:a: 1 b: 2 args: (3, 4) kwargs: {'c': 5, 'd': 6}
Python zgłosi błąd TypeError, jeśli po rozpakowaniu *args i **kwargs nie będzie zgodności z sygnaturą funkcji.
def example_func(a, b):
return a + b
example_func(1, 2, 3)Błąd:
TypeError: example_func() takes 2 positional arguments but 3 were given
def example_func(a, b):
return a + b
example_func(a=1, b=2, c=3)Błąd:
TypeError: example_func() got an unexpected keyword argument 'c'
Python automatycznie rozpakowuje *args i **kwargs do odpowiednich pozycji w sygnaturze funkcji. Jeśli po tym rozpakowaniu sygnatura nie pasuje do definicji funkcji, Python zgłasza błąd TypeError. To rozpakowywanie sprawia, że *args i **kwargs są niezwykle przydatne do tworzenia elastycznych funkcji, które mogą obsługiwać różnorodne zestawy argumentów. Pozwala to też na używanie super().{methoda}(*args, **kwargs) bez konieczności znajomości sygnatury wywoływanej funkcji, gdy jesteśmy pewni, że nie przekazujemy nadmiarowych argumentów - na przykład w Djangowym "Model.save()"