Monday, January 19, 2009

Python - jeszcze o gwiazdkach

We wpisie "Funkcje o nieograniczonej liczbie parametrów" pisałem o tym jak napisać funkcję, której można przekazać nieograniczoną liczbę parametrów. Ostatnio zacząłem się zastanawiać jak je przekazać. Weźmy funkcję, która będzie tylko wypisywała przekazane jej parametry

krotka = (1,2,3)
slownik = {'a': 'b', 'c': 'd', 'e': 'f'}

def fun(*args, **kwargs):
    print args
    print kwargs


Pytanie brzmi. Jak używajć krotki zrobić wywołanie funkcjie w stylu fun(1,2,3). Ktoś powie.. "No jak to jak ? fun(krotka)." A właśnie, że nie bo fun krotka to przekazanie jednego parametru do funkcji - będącego krotką i wywłanie będzie wyglądło tak:

fun((1,2,3))

Czyli przekazujemy krotkę parametrów a nie trzy parametry. No a słownik ? Jak przekazać do funkcji słownik tak aby wywołanie wyglądało następująco.

fun(a='b', c='d', e='f')

Zobaczmy :) ja to wygląda

fun(krotka)
((1, 2, 3),)
{}


fun(slownik)
({'a': 'b', 'c': 'd', 'e': 'f'},)
{}


A teraz rozwiązanie :)

fun(*krotka)
(1,2,3)
{}

fun(**slownik)
()
{'a': 'b', 'c': 'd', 'e': 'f'}

fun(*krotka, **slownik)
(1,2,3)
{'a': 'b', 'c': 'd', 'e': 'f'}

Widać składnia "gwiazdek" działa nie tylko przy tworzeniu funkcji ale również gdy chcemy aby krotka lub słownik "rozłożyły się" na parametry funkcji nie zaś zostały przekazane jako jeden parametr :) Do zapamiętania !

No comments: