✅ Atualizado para Python 3.13 (Dezembro 2025)
Conteúdo enriquecido com casos práticos (decorators, wrappers) e ordem de parâmetros.
Salve salve querido Pythonista!
*args e **kwargs permitem número variável de argumentos em funções! Essenciais para decorators, wrappers e APIs flexíveis.
Neste guia, você vai aprender:
- ✅
*args- Argumentos posicionais variáveis - ✅
**kwargs- Argumentos nomeados variáveis - ✅ Ordem de parâmetros - positional, *args, keyword, **kwargs
- ✅ Casos práticos - Decorators, loggers, wrappers
Nesse post veremos dois conceitos muito importantes, o conceito de *args (ou argumentos não nomeados) e **kwargs (ou argumentos nomeados)!
Ambos são geralmente utilizados no contexto da criação de Funções em Python.
Se ainda não domina Funções, clique aqui e veja nosso post completo sobre Funções no Python
Agora vamos desvendar o que essas duas palavrinhas querem dizer em Python! ![]()
Vá Direto ao Assunto…
*argse**kwargs- Argumentos não nomeados
*args - Argumentos nomeados
**kwargs - Casos Práticos
- Ordem de Parâmetros
*args e **kwargs
*Args e **kwargs permitem que você passe um número não especificado de argumentos para uma função.
Dessa forma, ao escrever uma função, você não precisa definir quantos argumentos serão passados para sua função.
Observação importante: Escrever *args e **kwargs é apenas uma convenção: *args vem do inglês “arguments” (argumntos) e **kwargs vem do inglês “keyword arguments” (argumentos nomeados). Podemos, por exemplo, utilizar *banana e **bananas se quisermos ![]()
Argumentos não nomeados *args
Vamos dar uma olhada em *args primeiro!
O *args é usado para receber uma lista de argumentos de comprimento variável sem a palavra-chave (keyword) na função.
Aqui está um exemplo pra facilitar o entendimento:
1
2
3
4
5
6
7
def função_com_argumentos_variaveis(arg, *args):
print("Primeiro argumento:", arg)
for agumento in args:
print("Argumento de *args", argumento)
função_com_argumentos_variaveis('primeiro_arg', 'arg2', 'arg3', 'arg3')
Veja a saída:
1
2
3
4
Primeiro argumento: primeiro_arg
Argumento de *args: arg2
Argumento de *args: arg3
Argumento de *args: arg3
Fique atento a ordem!
Argumentos não nomeados (*args) vem sempre primeiro que os argumentos nomeados (**kwargs).
Veja a seguinte chamada de função:
1
funcao_com_argumentos_variaveis(arg='arg', 'arg2', 'arg3', 'arg3')
O seguinte erro será lançado:
1
2
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
Agora vamos a um exemplo mais útil!
Uma função que soma os argumentos passados, independente do número de argumentos que seja passado, veja:
1
2
3
4
5
6
7
8
9
10
11
def adicao(*args):
resultado = 0
for argumento in args:
resultado += argumento
return resultado
print(adicao(1, 2))
print(adição(1, 2, 4, 6))
print(adição(1, 2, 4, 6, 8, 10))
Resultando em:
1
2
3
3
13
31
Estou desenvolvendo o DevBook, uma plataforma que usa IA para gerar ebooks técnicos profissionais. Te convido a conhecer!
Argumentos nomeados **kwargs
O **kwargs possibilita verificarmos os parâmetros nomeados da função, isto é, aqueles parâmetros que são passados com um nome!
Eles estarão disponíveis como um dicionário ({'chave': 'valor'}) dentro da função.
Vamos ao exemplo:
1
2
3
4
5
6
7
8
9
10
11
def concatena (**kwargs):
print(f'Valores recebidos: {kwargs}')
resultado = ""
for valor in kwargs.values():
resultado += f'{valor} '
return resultado
print(concatena(a="Python", b="Academy", c="Rules!"))
print()
print(concatena(a="Python", b="é", c="na", d="Python", e="Academy!"))
Veja a saída, perceba que recebemos um dict na variável kwargs:
1
2
3
4
5
Valores recebidos: {'a': 'Python', 'b': 'Academy', 'c': 'Rules!'}
Python Academy Rules!
Valores recebidos: {'a': 'Python', 'b': 'é', 'c': 'na', 'd': 'Python', 'e': 'Academy!'}
Python é na Python Academy!
Para melhor entender vamos juntar tudo e printar o que vem em cada um dos tipos de parâmetros.
Veja o exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def funcao(arg_1, arg_2, *args, arg_kw, **kwargs):
print(f'Parâmetro 1: {arg_1}')
print(f'Parâmetro 2: {arg_2}')
print(f'*args: {args}')
print(f'Argumento nomeado: {arg_kw}')
print(f'**kwargs: {kwargs}')
# Chamada da Função
funcao(
1, # Parâmetro 1
'a', # Parâmetro 2
'arg1', # *args
'arg2', # *args
2, # *args
arg_kw='KW',# arg_kw
banana='B', # **kwargs
bananas='A' # **kwargs
)
A saída deste código será:
Parâmetro 1: 1
Parâmetro 2: a
*args: ('arg1', 'arg2', 2)
Argumento nomeado: KW
**kwargs: {'banana': 'B', 'bananas': 'A'}Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Casos Práticos
1. Logger Flexível
1
2
3
4
5
6
7
8
def log(level, message, **metadata):
print(f"[{level}] {message}")
if metadata:
print(f"Metadata: {metadata}")
log("INFO", "Usuário logou")
log("ERROR", "Falha no banco", user_id=123, ip="192.168.1.1")
log("DEBUG", "Query executada", query="SELECT *", duration=0.5)
2. Decorator Genérico
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
def timer(func):
def wrapper(*args, **kwargs): # Aceita qualquer argumento!
start = time.time()
result = func(*args, **kwargs) # Passa adiante
duration = time.time() - start
print(f"{func.__name__} levou {duration:.2f}s")
return result
return wrapper
@timer
def processar(n, verbose=False):
time.sleep(n)
if verbose:
print(f"Processado {n}s")
processar(1)
processar(2, verbose=True)
3. Criar Objeto Dinâmico
1
2
3
4
5
6
7
8
9
10
11
12
class Config:
def __init__(self, **settings):
for key, value in settings.items():
setattr(self, key, value)
def __repr__(self):
attrs = ', '.join(f"{k}={v}" for k, v in self.__dict__.items())
return f"Config({attrs})"
config = Config(host="localhost", port=8000, debug=True)
print(config.host) # localhost
print(config) # Config(host=localhost, port=8000, debug=True)
4. Combinar Dicionários
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def merge_configs(*configs, override=True):
result = {}
for config in configs:
if override:
result.update(config) # Último sobrescreve
else:
for k, v in config.items():
result.setdefault(k, v) # Primeiro vence
return result
default = {'host': 'localhost', 'port': 8000}
user = {'port': 9000, 'debug': True}
final = merge_configs(default, user)
print(final) # {'host': 'localhost', 'port': 9000, 'debug': True}
Ordem de Parâmetros
1
2
3
4
5
6
7
8
9
10
11
12
13
def funcao(a, b, *args, key1, key2="default", **kwargs):
print(f"Posicionais obrigatórios: {a}, {b}")
print(f"Args extras: {args}")
print(f"Keyword obrigatório: {key1}")
print(f"Keyword com padrão: {key2}")
print(f"Kwargs extras: {kwargs}")
funcao(1, 2, 3, 4, key1="val1", key3="val3", key4="val4")
# Posicionais obrigatórios: 1, 2
# Args extras: (3, 4)
# Keyword obrigatório: val1
# Keyword com padrão: default
# Kwargs extras: {'key3': 'val3', 'key4': 'val4'}
Ordem SEMPRE:
- Posicionais obrigatórios:
a, b -
*args(variáveis posicionais) - Keywords obrigatórios:
key1 - Keywords com padrão:
key2="default" -
**kwargs(variáveis nomeados)
Conclusão
Neste guia de *args e **kwargs, você aprendeu:
✅ *args - Tupla de argumentos posicionais variáveis
✅ **kwargs - Dict de argumentos nomeados variáveis
✅ Desempacotamento - func(*lista), func(**dict)
✅ Ordem de parâmetros - Posicionais → *args → Keywords → kwargs
✅ **Casos práticos - Decorators, loggers, wrappers
Principais lições:
-
*argscaptura argumentos posicionais extras -
**kwargscaptura argumentos nomeados extras - Essenciais para decorators genéricos
- Use para APIs flexíveis
- Respeite a ordem de parâmetros!
Próximos passos:
- Pratique Decorators
- Aprenda Funções avançadas
- Explore type hints com
*args: inte**kwargs: str - Estude
*(keyword-only) e/(positional-only)
Agora você entende de onde vem esse tal de *args e **kwargs!
Se tiver qualquer dúvida, manda aqui embaixo no box de comentários ![]()
Até a próxima!
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6