
Que haja holivar! Usar args / kwargs ou não usar, é um indicador de profissionalismo ou conhecimento básico, sem o qual você deveria se envergonhar? Freqüentemente, folheando o github de vários projetos, você se depara com a presença desses argumentos nas funções simplesmente porque. E este artigo me levou a falar sobre esse assunto. Em geral, tento não usar argumentação descontrolada na prática, mas quão comum é esse método de programação? Compartilhe nos comentários. E boa leitura.
, *args
**kwargs
Python. , , . , .
!
. , , , .
?
Python :
, .
, .
def foo(start, end):
print(start, end)
, foo ('Hi', end = 'Bye!')
"Hi"
"Bye!"
, end
foo
. ; , , . .
*args
. *
- . .
def foo(*args):
print(type(args))
for arg in args:
print(arg)
foo(1, 2, 'end')
# <class 'tuple'>
# 1
# 2
# end
, **kwargs
. , .
def foo2(**kwargs):
print(type(kwargs))
for keyword, value in kwargs.items():
print(f'{keyword}={value}')
foo2(a=1, b=2, z='end')
# <class 'dict'>
# a=1
# b=2
# z=end

*args
**kwargs
. , ?
, , , .
, . - Python
- ?
: , . , , . , , , , , ..
, *args
/ **kwargs
, , , .
, . , , .
, Python , , , .

No exemplo a seguir, criamos
um que produz o nome da função que está sendo executada como uma verificação de saúde. O decorador é aplicado à função usando @trace
na parte superior da função, conforme mostrado abaixo. Como queremos aplicar este decorador a qualquer função com qualquer número de argumentos, precisamos usar *args
e **kwargs
.
def trace(func):
def print_in(*args, **kwargs):
print('Executing function', func.__name__)
return func(*args, **kwargs)
return print_in
@trace
def calc(a,b):
print(f'a+b is {a+b}, a-b is {a-b}.')
calc(1,2)
# Executing function calc
# a+b is 3, a-b is -1.
@trace
def add_all(*args):
print(reduce(lambda a,b:a+b, args))
a = add_all(1,2,3,4,5)
# Executing function add_all
# 15
conclusões
Evite-os se possível.
Observe que args
e kwargs
são assim chamados simplesmente por acordo. Você pode chamá-los do que quiser. São as estrelas *
que **
conferem às funções esse mesmo poder.