¿Para qué sirven **kwargs
en Python?
Sé que puedes hacer un objects.filter
sobre una mesa y pasar una **kwargs
discusión.
¿Puedo hacer esto también para especificar deltas de tiempo, es decir timedelta(hours = time1)
?
¿Cómo funciona exactamente? ¿Es clases como 'desempaquetar'? Al igual que a,b=1,2
?
kwargs
significaKeyWord ARGumentS
, es decir, argumentos que han establecido clavesRespuestas:
Puede usar
**kwargs
para permitir que sus funciones tomen una cantidad arbitraria de argumentos de palabras clave ("kwargs" significa "argumentos de palabras clave"):También puede usar la
**kwargs
sintaxis al invocar funciones construyendo un diccionario de argumentos de palabras clave y pasándolo a su función:El Tutorial de Python contiene una buena explicación de cómo funciona, junto con algunos buenos ejemplos.
<--Actualizar-->
Para las personas que usan Python 3, en lugar de iteritems (), use items ()
fuente
Desembalaje de diccionarios
**
desempaqueta diccionarios.Esta
es lo mismo que
Es útil si tiene que construir parámetros:
Parámetros de embalaje de una función
Esto le permite usar la función de esta manera:
fuente
** do unpack dictionaries.
>> alucinante / por supuesto! +1 por explicar ese bit..iteritems()
ha sido renombrado.items()
en Python 3.kwargs es solo un diccionario que se agrega a los parámetros.
Un diccionario puede contener pares clave, valor. Y esos son los kwargs. Ok, así es como.
El para qué no es tan simple.
Por ejemplo (muy hipotético) tiene una interfaz que solo llama a otras rutinas para hacer el trabajo:
Ahora obtienes un nuevo método "drive":
Pero espere un minuto, hay un nuevo parámetro "vehículo": no lo sabía antes. Ahora debe agregarlo a la firma de la función myDo.
Aquí puedes lanzar kwargs al juego; solo tienes que agregar kwargs a la firma:
De esta manera, no necesita cambiar la firma de la función de su interfaz cada vez que cambien algunas de sus rutinas llamadas.
Este es solo un buen ejemplo que podría encontrar útil a kwargs.
fuente
Sobre la base de que una buena muestra es a veces mejor que un discurso largo, escribiré dos funciones usando todas las facilidades de paso de argumentos variables de Python (tanto argumentos posicionales como nombrados). Debería poder ver fácilmente lo que hace usted mismo:
Y aquí está el resultado:
fuente
Motivo:
*args
y**kwargs
sirve como marcador de posición para los argumentos que deben pasarse a una llamada de funciónusando
*args
y**kwargs
para llamar a una funciónAhora usaremos
*args
para llamar a la función definida anteriormenteresultado:
arg1: dos
arg2: 3
arg3: 5
Ahora, usando
**kwargs
para llamar a la misma funciónresultado:
arg1: 5
arg2: dos
arg3: 3
En
*args
pocas palabras : no tiene inteligencia, simplemente interpola los argumentos pasados a los parámetros (en orden de izquierda a derecha) mientras se**kwargs
comporta de manera inteligente colocando el valor apropiado en el lugar requeridofuente
kwargs
en**kwargs
es solo un nombre variable. Puedes muy bien tener**anyVariableName
kwargs
significa "argumentos de palabras clave". Pero creo que es mejor llamarlos "argumentos con nombre", ya que estos son simplemente argumentos pasados junto con nombres (no encuentro ningún significado para la palabra "palabra clave" en el término "argumentos de palabras clave". Supongo que "palabra clave" generalmente significa palabras reservadas por el lenguaje de programación y, por lo tanto, no deben ser utilizadas por el programador para nombres de variables. Aquí no sucede tal cosa en el caso de kwargs). Por lo que damos nombresparam1
yparam2
a dos valores de los parámetros pasados a la función de la siguiente manera:func(param1="val1",param2="val2")
en lugar de pasar sólo valores:func(val1,val2)
. Por lo tanto, creo que deberían llamarse adecuadamente "número arbitrario de argumentos con nombre", ya que podemos especificar cualquier número de estos parámetros (es decir,func
func(**kwargs)
Dicho esto, permítanme explicar primero "argumentos con nombre" y luego "número arbitrario de argumentos con nombre"
kwargs
.Argumentos nombrados
Ejemplo
Número arbitrario de argumentos nombrados
kwargs
Ejemplo
Pasando variables tuple y dict para argumentos personalizados
Para terminar, déjame también notar que podemos pasar
Por lo tanto, la misma llamada anterior se puede hacer de la siguiente manera:
Finalmente, tenga en cuenta
*
y**
en las llamadas a funciones anteriores. Si los omitimos, podemos obtener malos resultados.Omitiendo
*
en tuple args:huellas dactilares
La tupla anterior
('custom param1', 'custom param2', 'custom param3')
se imprime tal como está.Omitiendo
dict
args:da
fuente
keyword
terminología proviene del hecho de que está pasando un dict que es una base de datos de pares clave-valor.Además, también puede mezclar diferentes formas de uso al llamar a las funciones de kwargs:
da esta salida:
Tenga en cuenta que ** kwargs tiene que ser el último argumento
fuente
Los kwargs son un azúcar sintáctico para pasar argumentos de nombre como diccionarios (para func), o diccionarios como argumentos con nombre (para func)
fuente
Aquí hay una función simple que sirve para explicar el uso:
Cualquier argumento que no esté especificado en la definición de la función se colocará en la
args
lista, o en lakwargs
lista, dependiendo de si son argumentos de palabras clave o no:Si agrega un argumento de palabra clave que nunca se pasa a una función, se generará un error:
fuente
Aquí hay un ejemplo que espero sea útil:
Cuando ejecuta el programa, obtiene:
La clave aquí es que el número variable de argumentos nombrados en la llamada se traduce en un diccionario en la función.
fuente
Este es el ejemplo simple para entender sobre el desempaquetado de Python ,
eg1:
fuente
En Java, usa constructores para sobrecargar clases y permitir múltiples parámetros de entrada. En python, puede usar kwargs para proporcionar un comportamiento similar.
ejemplo de java: https://beginnersbook.com/2013/05/constructor-overloading/
ejemplo de python:
solo otra forma de pensarlo.
fuente
Los argumentos de palabras clave a menudo se acortan a kwargs en Python. En programación de computadoras ,
El uso de los dos asteriscos antes del nombre del parámetro, ** kwargs , es cuando uno no sabe cuántos argumentos de palabras clave se pasarán a la función. Cuando ese es el caso, se llama Arbitrary / Wildcard Keyword Arguments.
Un ejemplo de esto son las funciones del receptor de Django .
Tenga en cuenta que no tiene que llamarse kwargs , pero debe tener ** (el nombre kwargs es una convención).
fuente