Skip to content

Instantly share code, notes, and snippets.

@jacoor
Last active June 8, 2024 17:09
Show Gist options
  • Save jacoor/704a9330715ce7b7eaa6103781468159 to your computer and use it in GitHub Desktop.
Save jacoor/704a9330715ce7b7eaa6103781468159 to your computer and use it in GitHub Desktop.

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.

Jak Python rozpakowuje *args i **kwargs

  1. 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 i 4 do krotki args:

    a: 1
    b: 2
    args: (3, 4)
    
  2. 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 i d=4 do słownika kwargs:

    a: 1
    b: 2
    kwargs: {'c': 3, 'd': 4}
    
  3. Rozpakowywanie *args i **kwargs jednocześnie

    def 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 i 4 do krotki args, oraz c=5 i d=6 do słownika kwargs:

    a: 1
    b: 2
    args: (3, 4)
    kwargs: {'c': 5, 'd': 6}
    

Przykłady z błędami TypeError

Python zgłosi błąd TypeError, jeśli po rozpakowaniu *args i **kwargs nie będzie zgodności z sygnaturą funkcji.

Zbyt wiele argumentów pozycyjnych:

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

Nieznany argument nazwany:

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'

Podsumowanie

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()"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment