Funções em Python: entendendo parâmetros, argumentos, *args e **kwargs
Funções em Python são blocos de código que executarão algum tipo de tarefa ou manipulação de dados, podendo ou não receber: dados de entrada (parâmetros/argumentos).
Parâmetros: são os nomes dados aos atributos que uma função pode receber. Definem quais argumentos são aceitos por uma função, podendo ou não ter um valor padrão (default).
Argumentos: são os valores que realmente são passados para uma função.
Veja a simples função abaixo:
No exemplo acima na função calculadora_salario
, definimos dois parâmetros que são chamados de valor
e horas
. O parâmetro valor
não possui um valor default, então é obrigatório passá-lo como argumento. Já o parâmetro horas
possui um valor default, o que o torna a passagem do argumento não obrigatório, assim é assumido o valor 220. Caso não passarmos o argumento para o parâmetro valor
recebemos o seguinte erro:
Traceback (most recent call last):
File "learn_decorators.py", line 41, in <module>
print(calculadora_salario())
TypeError: calculadora_salario() missing 1 required positional argument: 'valor'
Note que os parâmetros obrigatórios devem ser colocados antes de qualquer parâmetro default (da esquerda para direita), para que não ocorra uma confusão no interpretador e ocorra o erro:
SyntaxError: non-default argument follows default argument
Agora que entendemos obrigatoriedade de parâmetros, vamos analisar o uso dos parâmetros *args
e **kwargs
.
Para começo de conversa, as palavras args
e kwargs
são apenas usadas como convenção, ou seja, poderiam ter qualquer outro nome, por exemplo: *parms e **kwparms.
*args
É usado para passar um lista de argumentos variável sem palavras-chave em forma de tupla, pois a função que o recebe não necessariamente saberá quantos argumentos serão passados.
Exemplo:
# Output:
tipo: <class 'tuple'> conteúdo: (1, 'A', {'valor': 10})tipo: <class 'int'> conteúdo: 1
tipo: <class 'str'> conteúdo: A
tipo: <class 'dict'> conteúdo: {'valor': 10}
No exemplo acima temos uma função que recebe um parâmetro do tipo *args
com alguns argumentos e escreve no terminal o tipo e o conteúdo, junto com o tipo e conteúdo de cada argumento da tupla.
**kwargs
Como a abreviação sugere, kwargs
significa keyword arguments (argumentos de palavras chave). Ele permite passar um dicionário com inúmeras keys para a função.
Exemplo:
# Output
tipo: <class 'dict'> conteúdo: {'nome': 'James', 'sobrenome': 'Bond', 'cargo': 'Agente 007'}atributo: nome, valor: James
atributo: sobrenome, valor: Bond
atributo: cargo, valor: Agente 007
Como vimos acima no output da função usando **
podemos notar que o tipo do argumento é passado como dicionário com chaves e valores.
Outra forma de passar um dicionário já existente é usando os **
na passagem do parâmetro:
parms = {
'nome': 'James',
'sobrenome': 'Bond',
'cargo': 'Agente 007'
}func_kwargs(**parms)
Agora para finalizar vamos ver como ficaria um função usando todos os parâmetros que vimos.
# Output
Nome do agente: James Bond
Função: agente
('Missão 1', 'Missão 2')
{'id_agente': '007', 'proxima_missao': 'Impossível'}
No exemplo acima, usamos todos os recursos mencionados no post:
- O parâmetro nome recebe o valor “James Bond”;
- O parâmetro função utilizou o valor “agente” definido como default;
- O parâmetro
args
recebeu os valores “Missao 1” e “Missao 2” como tupla; - O parâmetro
kwargs
recebeu dois parâmetros nomeados como dicionário: {‘id_agente’: ‘007’, ‘proxima_missao’: ‘Impossível’}
Por hoje é isso pessoal, aprendemos um pouco sobre esse recurso muito interessante da linguagem Python. Espero ter ajudado no entendimento dessas palavrinhas especiais para construção de funções. Até a próxima.