Argumentos normales frente a argumentos de palabras clave
¿En qué se diferencian los "argumentos de palabras clave" de los argumentos normales? ¿ No se pueden pasar todos los argumentos en name=value
lugar de utilizar la sintaxis posicional?
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 haya mencionado en absoluto.
El otro concepto está en el lado de la definición de la función: 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
def my_function(arg1, arg2, **kwargs)
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í:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
Hay una última característica del lenguaje donde la distinción es importante. Considere la siguiente función:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
El *positional
argumento almacenará todos los argumentos posicionales pasados a foo()
, sin límite de cuántos puede proporcionar.
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
El **keywords
argumento almacenará cualquier argumento de palabra clave:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
Y por supuesto, puedes utilizar ambos al mismo tiempo:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
Estas características rara vez se utilizan, pero en ocasiones son muy útiles y es importante saber qué argumentos son posicionales o palabras clave.
Usar argumentos de palabras clave es lo mismo que los argumentos normales excepto que el orden no importa. Por ejemplo, las dos llamadas a funciones siguientes son iguales:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
Argumentos posicionales
No tienen palabras clave delante de ellos. ¡El orden es importante!
func(1,2,3, "foo")
Argumentos de palabras clave
Tienen palabras clave en el frente. ¡Pueden estar en cualquier orden!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
También debe saber que si utiliza argumentos predeterminados y no inserta las palabras clave, ¡el orden importará!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)