¿Para qué sirven **kwargsen Python?
Sé que puedes hacer un objects.filtersobre una mesa y pasar una **kwargsdiscusió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?

kwargssignificaKeyWord ARGumentS, es decir, argumentos que han establecido clavesRespuestas:
Puede usar
**kwargspara permitir que sus funciones tomen una cantidad arbitraria de argumentos de palabras clave ("kwargs" significa "argumentos de palabras clave"):También puede usar la
**kwargssintaxis 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:
*argsy**kwargssirve como marcador de posición para los argumentos que deben pasarse a una llamada de funciónusando
*argsy**kwargspara llamar a una funciónAhora usaremos
*argspara llamar a la función definida anteriormenteresultado:
arg1: dos
arg2: 3
arg3: 5
Ahora, usando
**kwargspara llamar a la misma funciónresultado:
arg1: 5
arg2: dos
arg3: 3
En
*argspocas palabras : no tiene inteligencia, simplemente interpola los argumentos pasados a los parámetros (en orden de izquierda a derecha) mientras se**kwargscomporta de manera inteligente colocando el valor apropiado en el lugar requeridofuente
kwargsen**kwargses solo un nombre variable. Puedes muy bien tener**anyVariableNamekwargssignifica "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 nombresparam1yparam2a 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,funcfunc(**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
kwargsEjemplo
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
dictargs:da
fuente
keywordterminologí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
argslista, o en lakwargslista, 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