Deje de abusar de * args y ** kwargs en Python

Foto de Matthew Henry en Unsplash
Foto de Matthew Henry en Unsplash

¡Que sea holivar! Usar args / kwargs o no usar, ¿es esto un indicador de profesionalismo o conocimientos básicos, sin los cuales debería avergonzarse? A menudo, al hojear el github de varios proyectos, se encuentra con la presencia de estos argumentos en funciones simplemente porque. Y este artículo me impulsó a hablar sobre este tema. En general, trato de no usar la argumentación incontrolada en la práctica, pero ¿qué tan común es este método de programación? Comparte en los comentarios. Y disfruta tu lectura.






, *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
      
      



Foto de Susan Holt Simpson en Unsplash
Photo by Susan Holt Simpson on Unsplash

*args



**kwargs



. , ?





, , , .





, . - Python






- ?

: , . , , . , , , , , ..





, *args



/ **kwargs



, , , .





, . , , .





, Python , , , .





Foto de Alexander Schimmeck en Unsplash
Photo by Alexander Schimmeck on Unsplash

En el siguiente ejemplo, creamos



uno que genera el nombre de la función que se está ejecutando como una verificación de estado. El decorador se aplica a la función usando @trace



además de la función como se muestra a continuación. Ya que queremos aplicar este decorador a cualquier función con cualquier número de argumentos, necesitamos usar *args



y **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
      
      




conclusiones

Evítelos si es posible.





Tenga en cuenta que args



y kwargs



se llaman así simplemente por acuerdo. Puedes llamarlos como quieras. Son las estrellas las *



que **



dan a las funciones ese poder.








All Articles