11.1 Número infinito de parâmetros
Em Python, as funções podem ser desenvolvidas para aceitar uma quantidade infinita de parâmetros. Isso é alcançado usando argumentos passados através de *args para parâmetros comuns e **kwargs para parâmetros nomeados.
Usando *args
*args permite que uma função aceite um número arbitrário de argumentos posicionais, que a função tratará como uma tupla. Exemplo de uso:
def print_all(*args):
for item in args:
print(item)
print_all(1, 'apple', True) # vai imprimir 1, apple e True.
A variável args conterá uma tupla de todos os parâmetros que foram passados para a função quando ela foi chamada.
Usando **kwargs
**kwargs funciona de forma semelhante a *args, mas para argumentos nomeados, apresentados como um dicionário. Isso permite que a função aceite qualquer quantidade de argumentos nomeados:
def print_named_items(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_named_items(fruit='apple', number=1) # vai imprimir fruit: apple e number: 1
Esses mecanismos tornam as funções extremamente flexíveis e úteis em cenários onde o número de parâmetros é desconhecido, por exemplo, ao desenvolver APIs ou funções de manipulação de eventos.
Vamos nos aprofundar mais nesses casos mais tarde, mas você deve saber que em Python, dentro de uma função, é muito fácil acessar todos os argumentos que foram passados para ela. E você pode passar para a função qualquer coisa que quiser.
11.2 Especificando tipos
Como você sabe, as variáveis em Python não têm um tipo especificado previamente. Qualquer variável pode receber um valor de qualquer tipo e, na linha seguinte, receber um valor de um novo tipo, e assim por diante.
Isso é muito conveniente para programas pequenos e nem tão conveniente para programas grandes. Quando o programa é muito grande e o número de funções chega a milhares, o programador não consegue lembrar quais dados precisam ser passados para a função e em que ordem.
Em linguagens com tipagem estática, a IDE em si sugere aos programadores quais parâmetros e com quais tipos precisam ser passados ao chamar uma função. Mas o Python— é ainda uma linguagem de tipagem dinâmica, então não há de onde vir essas sugestões.
Por isso, os criadores do Python inventaram algo chamado type hinting. Isso é algo como tipos de variáveis, mas são mais como recomendações do que tipos. Nenhuma restrição os tipos indicados impõem.
A especificação de tipos foi introduzida no Python 3.5 e se tornou popular graças ao padrão PEP 484. É um mecanismo que permite que programadores definam os tipos esperados de variáveis, argumentos e valores de retorno de funções.
Embora o Python continue sendo uma linguagem de tipagem dinâmica, a especificação de tipos adiciona clareza e suporta a verificação estática de tipos. Exemplos de especificação de tipos:
def add_numbers(a: int, b: int) -> int:
return a + b
O tipo da variável é especificado através de dois pontos, e o tipo do resultado retornado da função através de uma setinha.
Vantagens que a especificação de tipo-recomendação proporciona:
- Melhoria da documentação: A especificação clara dos tipos torna o código auto documentado.
- Melhor preenchimento automático: Editores de código podem usar a informação de tipos para melhorar o preenchimento automático.
- Ajuda na depuração: A verificação estática de tipos pode identificar possíveis erros antes mesmo da execução do programa.
Ferramentas para trabalhar com tipos
O próprio Python não reage de forma alguma aos tipos declarados de variáveis. Em vez disso, o Python tem uma utilidade especial — mypy — um analisador estático de tipos popular que ajuda a capturar erros no código, que utiliza a especificação de tipos.
GO TO FULL VERSION