Argumentos normales frente a argumentos de palabras clave

Resuelto mk12 asked hace 15 años • 10 respuestas

¿En qué se diferencian los "argumentos de palabras clave" de los argumentos normales? ¿ No se pueden pasar todos los argumentos en name=valuelugar de utilizar la sintaxis posicional?

mk12 avatar Sep 14 '09 05:09 mk12
Aceptado

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'}
Ian Clelland avatar Sep 13 '2009 23:09 Ian Clelland

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 *positionalargumento 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 **keywordsargumento 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.

too much php avatar Sep 13 '2009 23:09 too much php

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)
Eli Grey avatar Sep 13 '2009 23:09 Eli Grey

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)
Unknown avatar Sep 13 '2009 23:09 Unknown