quinta-feira, 12 de março de 2015

Python *args **kwargs

Quando criamos um método, procedimento ou função, normalmente precisamos passar alguns parâmetros para seu funcionamento, para que a função possar ser reutilizada em outros momentos.

Conforme a função precisamos de mais ou menos parâmetros. Quando a função precisa de muitos parâmetros pode ficar um pouco confusa sua utilização, principalmente quando somente a ordem dos parâmetros é utilizada para definir suas intenções.

def soma(a,b):
    return a + b

print soma(4,3)



Neste caso é uma função simples, sendo fácil de compreender as intenções dos parâmetros da função. Agora um caso com mais parâmetros pode ficar complexo.

def criar_matriz(linhas,colunas,valor):
    matriz = []
    for l in range (0,linhas):
        linha = []
        for c in range(0,colunas):
            linha.append(valor)
        matriz.append(linha)
    return matriz

print criar_matriz(3,3,None)



Neste exemplo já é mais fácil de se confundir, por exemplo invertendo os parâmetros "linhas" e "colunas". Porém o Python nos possibilita chamar a função de uma outra maneira, deixando mais explicita as intenções dos parâmetros.

def criar_matriz(linhas,colunas,valor):
    matriz = []
    for l in range (0,linhas):
        linha = []
        for c in range(0,colunas):
            linha.append(valor)
        matriz.append(linha)
    return matriz

print criar_matriz(3,3,None)
print criar_matriz(linhas=2,colunas=3,valor=None)
print criar_matriz(valor=None,colunas=3,linhas=2)
print criar_matriz(2,3,valor=None)



Desta forma podemos até definir a ordem em que passamos estes parâmetros.
Também é possível montar os parâmetros desta função de forma dinâmica.

def criar_matriz(linhas,colunas,valor):
    matriz = []
    for l in range (0,linhas):
        linha = []
        for c in range(0,colunas):
            linha.append(valor)
        matriz.append(linha)
    return matriz

parametros_ordenados = [2,3,None]

parametros_nomeados = {
    'linhas' : 2,
    'colunas' : 3,
    'valor' : None
}

print criar_matriz(*parametros_ordenados)
print criar_matriz(**parametros_nomeados)



O "**" faz com que o dicionario seja usado como argumentos nomeados e o "*" faz com que o vetor seja utilizado como argumentos ordenados.
Esse recurso também pode ser utilizado dentro da função, possibilitando que a função fique mais dinâmica.

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

funcao_parametros_dinamicos(1,2,3,name='Programando no Aquario')


Obrigado!