¿En qué se diferencian los "argumentos de palabras clave" de los argumentos regulares? ¿No se pueden pasar todos los argumentos en name=value
lugar de utilizar la sintaxis posicional?
289
¿En qué se diferencian los "argumentos de palabras clave" de los argumentos regulares? ¿No se pueden pasar todos los argumentos en name=value
lugar de utilizar la sintaxis posicional?
Respuestas:
Hay dos conceptos relacionados, ambos llamados " argumentos de palabras clave ".
En el lado de la llamada, que es lo que han mencionado otros comentaristas, tiene la capacidad de especificar algunos argumentos de función por nombre. Debe mencionarlos después de todos los argumentos sin nombres ( argumentos posicionales ), y debe haber valores predeterminados para cualquier parámetro que no se mencionó en absoluto.
El otro concepto está en el lado de la definición de funciones: puede definir una función que tome parámetros por nombre, y ni siquiera tiene que especificar cuáles son esos nombres. Estos son argumentos de palabras clave puras y no se pueden pasar posicionalmente. La sintaxis es
Cualquier argumento de palabra clave que pase a esta función se colocará en un diccionario llamado
kwargs
. Puede examinar las claves de este diccionario en tiempo de ejecución, así:fuente
kwargs
o puedo cambiarle el nombre a algo? comooptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
es la convención cuando no hay un nombre más apropiadoHay una última característica del idioma donde la distinción es importante. Considere la siguiente función:
El
*positional
argumento almacenará todos los argumentos posicionales pasadosfoo()
, sin límite de cuántos puede proporcionar.El
**keywords
argumento almacenará cualquier argumento de palabra clave:Y, por supuesto, puede usar ambos al mismo tiempo:
Estas características rara vez se usan, pero ocasionalmente son muy útiles, y es importante saber qué argumentos son posicionales o palabras clave.
fuente
*positional
y**keywords
si cambiamos la definición de la función comodef foo(arg1, *positional, **keywords):
. Aquíarg1
es posicional y requerido. Tenga en cuenta que posicional en respuesta significa un número opcional y variable de argumentos posicionales.foo(bar=True)
, puede obtener los valores utilizando elbar = keywords.pop('bar')
mismo quebar = keywords.pop('bar', None)
. Para el valor predeterminado, usebar = keywords.pop('bar', False)
Usar argumentos de palabras clave es lo mismo que los argumentos normales, excepto que el orden no importa. Por ejemplo, las dos llamadas de funciones a continuación son las mismas:
fuente
Argumentos Posicionales
No tienen palabras clave antes que ellos. ¡El orden es importante!
Argumentos de palabras clave
Tienen palabras clave en el frente. ¡Pueden estar en cualquier orden!
También debe saber que si usa argumentos predeterminados y descuida insertar las palabras clave, ¡entonces el orden será importante!
fuente
func("bar", 5)
? Y luego decir quehello
obtiene su valor predeterminado de3
.Hay dos formas de asignar valores de argumentos a los parámetros de función, ambos se utilizan.
Por puesto. Los argumentos posicionales no tienen palabras clave y se asignan primero.
Por palabra clave. Los argumentos de palabras clave tienen palabras clave y se asignan en segundo lugar, después de los argumentos posicionales.
Tenga en cuenta que usted tiene la opción de utilizar argumentos posicionales.
Si usted no utiliza argumentos posicionales, a continuación, - sí - todo lo que escribiste resulta ser un argumento de palabra clave.
Cuando se llama a una función de tomar una decisión de posición de uso o una palabra clave o una mezcla. Puede elegir hacer todas las palabras clave si lo desea. Algunos de nosotros no hacemos esta elección y usamos argumentos posicionales.
fuente
Me sorprende que nadie parezca haber señalado que se puede pasar un diccionario de parámetros de argumentos clave, que satisfacen los parámetros formales, de esa manera.
fuente
, **kwargs
. Eso demostraría que incluso una simple función def, con un número fijo de parámetros, se puede suministrar un diccionario. Es decir, no requiere nada elegante en la definición. ENTONCES puede agregar un segundo ejemplo, CON ** kwargs en definición, y mostrar cómo los elementos EXTRA en el diccionario están disponibles a través de eso.print 'a:%s, b:%s, c:%s' % (a, b, c)
da error de sintaxis, sin embargoprint('a:%s, b:%s, c:%s' % (a, b, c))
funciona. ¿Algo con la versión de Python? De todos modos, gracias por esta idea, hasta ahora estaba usando el más torpeprint('a:{}, b:{}, c:{}'.format(a, b, c))
Con Python 3 puede tener argumentos de palabras clave tanto obligatorios como no obligatorios :
Opcional : (valor predeterminado definido para el parámetro 'b')
Obligatorio (sin valor predeterminado definido para el parámetro 'b'):
Esto puede ayudar en casos en los que tiene muchos argumentos similares uno al lado del otro, especialmente si son del mismo tipo, en ese caso prefiero usar argumentos con nombre o creo una clase personalizada si los argumentos van de la mano.
fuente
Me sorprende que nadie haya mencionado el hecho de que puede mezclar argumentos posicionales y de palabras clave para hacer cosas furtivas como esta usando
*args
y**kwargs
( desde este sitio ):Esto le permite utilizar argumentos de palabras clave arbitrarias que pueden tener claves que no desea definir por adelantado.
fuente
Estaba buscando un ejemplo que tuviera kwargs predeterminados usando la anotación de tipo:
ejemplo:
fuente
Simplemente suplemente / agregue una forma de definir el valor predeterminado de los argumentos que no se asignan en palabras clave al llamar a la función:
llama a esto por:
obtendrás:
Lea más sobre
*args
y**kwargs
en Python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3fuente