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
*args
pozwala 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
3
i4
do krotkiargs
:a: 1 b: 2 args: (3, 4)
-
Rozpakowywanie
**kwargs
**kwargs
pozwala 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=3
id=4
do słownikakwargs
:a: 1 b: 2 kwargs: {'c': 3, 'd': 4}
-
Rozpakowywanie
*args
i**kwargs
jednocześ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
3
i4
do krotkiargs
, orazc=5
id=6
do 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()"