¿En qué se diferencian los "argumentos de palabras clave" de los argumentos comunes? ¿No se pueden pasar todos los argumentos como name=value
en lugar de utilizar la sintaxis posicional?Argumentos normales de Python contra argumentos de palabra clave
Respuesta
hay dos conceptos relacionados, ambos denominados "argumentos de palabra clave".
Por el lado de las llamadas, que es lo que otros comentadores han mencionado, usted 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 los parámetros que no se mencionaron en absoluto.
El otro concepto está en el lado de la definición de función: Puede definir una función que tome parámetros por nombre, y usted ni siquiera tiene que especificar cuáles son esos nombres. Estos son argumentos puros de palabras clave, 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'}
+1 y aceptado: Usted es el único que habló sobre ambos tipos de argumentos posicionales + palabras clave, todos los demás pensaron que estaba hablando del primero o el segundo (pero aún así eran buenas publicaciones). ¡Gracias! – mk12
La redacción no está clara: normalmente habla de argumentos en el lado de la llamada mientras que de parámetros en el lado de la llamada. – glglgl
Hay dos formas de asignar valores de argumento a los parámetros de función, ambos se utilizan.
Por posición. 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 que tiene la opción de utilizar argumentos posicionales.
Si que no utilizan argumentos posicionales, a continuación, - sí - todo lo que escribió resulta ser un argumento de palabra clave.
Cuando usted llama a una función que 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.
El uso de argumentos de palabra clave es lo mismo que los argumentos normales, excepto que el orden no importa. Por ejemplo las dos funciones llamadas a continuación son los mismos:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
Gracias por esto.Es increíblemente útil que ** pueda ** especificar una palabra clave arg como una arg posicional, ** y ** una arg posicional como una palabra clave arg. –
argumentos posicionales
No tienen palabras clave ante ellos. ¡El orden es importante!
func(1,2,3, "foo")
argumentos clave
Tienen palabras clave en la parte delantera. ¡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 olvida insertar las palabras clave, ¡entonces el orden será importante!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
en mi humilde opinión, el tercer ejemplo (argumentos por defecto) no es claro. Creo que estás hablando de lo que sucede cuando uno o más parámetros declaran valores predeterminados, y la llamada usa notación posicional, pero proporciona MENOS que el número de parámetros declarados. Sin embargo, su ejemplo tiene 3 declarados y 3 en la llamada, por lo que los valores predeterminados no tienen ningún efecto. ¿Pensabas omitir el 3er arg? p.ej. 'func (" barra ", 5)'? Y luego diga que 'hello' obtiene su valor predeterminado de' 3'. – ToolmakerSteve
Me sorprende que nadie ha mencionado el hecho de que se puede mezclar argumentos posicionales y de palabras clave para hacer cosas como esta disimulados mediante *args
y **kwargs
(from this site):
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 a utilice argumentos arbitrarios de palabras clave que pueden tener claves que no desea definir por adelantado.
Hay una característica del último idioma 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 en la cantidad que se puede brindar.
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
El argumento **keywords
almacenará los argumentos de palabras clave:
>>> foo(a='one', b='two', c='three')
Positional:()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
Y, por supuesto, puede utilizar ambos al mismo tiempo:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
Estas características se usan muy poco, pero ocasionalmente son muy útiles, y es importante saber qué argumentos son posicionales o palabras clave.
¡Excelente respuesta! Solo se puede pasar una nota que requiera argumentos posicionales antes de '* positional' y' ** keywords' si cambiamos la definición de función como 'def foo (arg1, * positional, ** keywords):'. Aquí 'arg1' es posicional y obligatorio. Tenga en cuenta que posicional en respuesta significa número opcional y variable de argumentos posicionales. – shaffooo
Me sorprende que nadie parece haber señalado que se puede pasar de un diccionario de parámetros de argumentos con llave, que satisfacen los formales parámetros, como tal.
>>> 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
>>>
+1 para una técnica útil. Su punto sería más claro, sin ', ** kwargs'. Eso demostraría que incluso una definición de función simple, con un número fijo de parámetros, puede suministrarse en un diccionario. Es decir, no requiere nada sofisticado en la definición. ENTONCES podría 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. – ToolmakerSteve
He visto esto suceder en el código fuente de varias bibliotecas y estaba tan confundido. ¡Gracias por aclararme! –
El cuarto parámetro formal anterior - ** kwargs es necesario si alguna vez llama a func con un diccionario que contiene claves distintas de 'a', 'b' y 'c'. – Eduardo
Usando Python 3 puede tener tanto necesaria y la palabra clave arguments no requiere:
Opcional: (valor predeterminado definido para 'b')
def func1(a, *, b=42):
...
func1(value_for_a) # b is optional and will default to 42
Obligatorio (no se ha definido un valor predeterminado 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 que tenga muchos argumentos similares uno al lado del otro, especialmente si son del mismo tipo, en ese caso prefiero usar argumentos con nombre o crear una clase personalizada si los argumentos van juntos.
La variante * requerida * es bastante útil. Insta a dar los args por nombre sin proporcionar los valores predeterminados, que a menudo no tiene sentido. – TNT
Los valores predeterminados se ven bien y pueden ayudarlo a ahorrar tiempo cuando comienza, pero a la larga los valores predeterminados pueden ser un PITA. –
- 1. Argumentos de palabra clave de multiprocesamiento de Python
- 2. ¿Cómo puedo tratar los argumentos posicionales como argumentos de palabra clave en Python 2
- 3. Argumentos de Python y mejores prácticas de palabras clave-argumentos
- 4. pitón argumentos posicionales y argumentos de palabras clave
- 5. ¿La manera más pitónica de asignar argumentos de palabra clave usando una variable como palabra clave?
- 6. Argumentos de palabras clave dinámicas en Python?
- 7. argumentos de palabras clave Clojure
- 8. Manera pitónica de pasar argumentos de palabra clave en condicional
- 9. argumentos clave de rubí método
- 10. Inversa de '*' con los argumentos '()' y argumentos de palabra clave '{}' no se ha encontrado
- 11. ¿Pueden las macros Racket tomar argumentos de palabra clave?
- 12. C++ palabra clave explícita para la función sin argumentos
- 13. ¿Puede enumerar los argumentos de palabra clave que recibe una función de Python?
- 14. Argumentos en contra de Crear o actualizar
- 15. Python, argumentos predeterminados de palabras clave después de argumentos posicionales de longitud variable
- 16. argumentos de Python subproceso
- 17. ¿Cuál es la diferencia entre los argumentos con valores predeterminados y argumentos de palabras clave?
- 18. ¿Cuál es el estado actual de los argumentos con nombre (llamados parámetros de método, argumentos de palabra clave) en Ruby?
- 19. Python: Extraño comportamiento de la función recursiva con argumentos clave
- 20. Python obtener argumentos para funciones parciales
- 21. Argumentos de Python como diccionario
- 22. Cómo emular argumentos de palabra clave en las funciones de ActionScript 3
- 23. Python argumentos hermosa sopa
- 24. ¿Cómo puedo tener argumentos opcionales Y argumentos de palabras clave para la misma función?
- 25. Argumento de la palabra clave al desempaquetar los casos de la lista de argumentos/dict en Python
- 26. ¿Cómo puedo mezclar argumentos de palabra clave opcionales con & cosas de descanso?
- 27. argumentos de multiprocesamiento de python: ¿copia profunda?
- 28. Argumentos del decorador de clases de Python
- 29. Argumentos de línea de comando en python.
- 30. Python __init__ setattr en argumentos?
Es posible que también desee leer PEP 3102: están ordenando algunas de estas cosas en Python 3. Consulte: http://www.python.org/dev/peps/pep-3102/ –
Y si o no hay un valor predeterminado que no tenga nada que ver con eso (excepto si necesita o no pasarle un valor), ¿verdad? – mk12
Más información sobre [argumentos posicionales/de palabras clave de python] (http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html) – ducin