Python normal argumentos frente parámetros de palabra clave


¿En qué se diferencian los "argumentos de palabra clave" de los argumentos regulares? ¿No se pueden pasar todos los argumentos como name=value en lugar de usar sintaxis posicional?

Author: mk12, 2009-09-14

8 answers

Hay dos conceptos relacionados, ambos llamados "argumentos de palabras clave".

En el lado de la llamada, que es lo que otros comentaristas han mencionado, tiene la capacidad de especificar algunos argumentos de función por nombre. Tiene que 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't y ni siquiera tienes que especificar cuáles son esos nombres. Estos son argumentos de palabras clave puros, 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. Puedes 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'}
 290
Author: Ian Clelland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-13 23:58:51

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 argumento *positional 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 argumento **keywords 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 usar 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 ocasionalmente son muy útiles, y es importante saber qué argumentos son posicionales o palabras clave.

 155
Author: too much php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-13 23:58:17

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 a continuación son las mismas:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)
 88
Author: Eli Grey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-13 23:17:03

Argumentos posicionales

No tienen palabras clave antes que ellos. El orden es importante!

func(1,2,3, "foo")

Argumentos de palabras clave

Tienen palabras clave en el frente. Ellos 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 omite insertar las palabras clave, ¡entonces el orden importará!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
 37
Author: Unknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 10:27:54

Hay dos formas de asignar valores de argumento a los parámetros de la función, ambos se utilizan.

  1. Por Posición. Los argumentos posicionales no tienen palabras clave y se asignan primero.

  2. 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 usar argumentos posicionales.

Si no usas argumentos posicionales, entonces everything sí everything todo you wrote resulta ser un argumento de palabra clave.

Cuando usted llama a una función usted toma la decisión de usar posición o 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.

 23
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-13 23:21:05

Me sorprende que nadie parece haber señalado que uno puede pasar un diccionario de parámetros de argumento con clave, que satisfacen los parámetros formales, así.

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 
 20
Author: sherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 22:07:55

Usando Python 3 puede tener argumentos de palabra clave requeridos y no requeridos :

Opcional: (valor predeterminado definido para 'b')

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

Requerido (no hay valor predeterminado definido para 'b'):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

Esto puede ayudar en los casos en los que tiene muchos argumentos similares uno al lado del otro, especialmente cuando son del mismo tipo, en ese caso prefiero usar argumentos con nombre o crear una clase personalizada si los argumentos pertenecen juntos.

 12
Author: Christophe Roussy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 08:43:00

Me sorprende que nadie haya mencionado el hecho de que puedes mezclar argumentos posicionales y de palabras clave para hacer cosas astutas como esta usando *args y **kwargs (desde este sitio):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

Esto le permite usar argumentos de palabras clave arbitrarios que pueden tener claves que no desea definir por adelantado.

 11
Author: Gabriel Hurley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-13 23:52:00