¿Qué hace un asterisco desnudo en los argumentos de una función?
Cuando miré el módulo de pickle , veo esto:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Sé sobre un asterisco simple y doble que precede a los argumentos (para un número variable de argumentos), pero esto no precede a nada. Y estoy bastante seguro de que esto no tiene nada que ver con el pepinillo. Probablemente sea solo un ejemplo de que esto está sucediendo. Solo supe su nombre cuando envié esto al intérprete:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Si importa, estoy en Python 3.3.0.
Respuestas:
Desnudo
*
se usa para obligar a la persona que llama a usar argumentos con nombre, por lo que no puede definir una función*
como argumento cuando no tiene argumentos de palabras clave siguientes.Vea esta respuesta o la documentación de Python 3 para más detalles.
fuente
*args
, deben aparecer antes de lo básico*
.*
está en lugar de*args
, y viceversa; No pueden coexistir en una firma. Por eso eligieron*
; anteriormente,*args
era la única forma de forzar argumentos puramente posicionales, y marcaba el final de los argumentos que podían pasarse posicionalmente (dado que reunía todos los argumentos posicionales restantes, podían llegar a los siguientes argumentos nombrados).*
significa que los mismos "argumentos posicionales no pueden ir más allá de aquí", pero la falta de un nombre significa "pero no los aceptaré en absoluto, porque elegí no proporcionar un lugar para ponerlos".Si bien la respuesta original responde la pregunta por completo, solo agrega un poco de información relacionada. El comportamiento del asterisco único deriva de
PEP-3102
. Citando la sección relacionada:En inglés simple, significa que para pasar el valor de la clave, deberá pasarlo explícitamente como
key="value"
.fuente
*
es engullir los argumentos posicionales restantes, pero ese no es el caso. Al pasar argumentos posicionales adicionales de lo que la función espera, se produce un error de este tipo:foo() takes exactly 1 positional argument (2 given)
el ejemplo anterior con ** kwargs
fuente
Semánticamente, significa que los argumentos que siguen son solo palabras clave, por lo que obtendrá un error si intenta proporcionar un argumento sin especificar su nombre. Por ejemplo:
Pragmáticamente, significa que debe llamar a la función con un argumento de palabra clave. Por lo general, se hace cuando sería difícil entender el propósito del argumento sin la pista dada por el nombre del argumento.
Compare, por ejemplo,
sorted(nums, reverse=True)
vs. si escribiósorted(nums, True)
. Esto último sería mucho menos legible, por lo que los desarrolladores de Python decidieron obligarlo a escribirlo de la manera anterior.fuente
Supongamos que tiene una función:
Puede llamar a esta función de 2 maneras:
sum(1,2)
osum(1,key=2)
Suponga que desea
sum
que se llame a la función solo con argumentos de palabras clave.Se agrega
*
a la lista de parámetros de funciones para marcar el final de los argumentos posicionales.Entonces función definida como:
puede ser llamado solo usando
sum(1,key=2)
fuente
He encontrado el siguiente enlace a ser muy útil para explicar
*
,*args
y**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Esencialmente, además de las respuestas anteriores, he aprendido del sitio anterior (crédito: https://pythontips.com/author/yasoob008/ ) lo siguiente:
Con la función de demostración definida primero a continuación, hay dos ejemplos, uno con
*args
y otro con**kwargs
Por lo tanto, le
*args
permite construir dinámicamente una lista de argumentos que se tomarán en el orden en que se alimentan, mientras que**kwargs
puede permitir el paso de argumentos NAMED y NAME puede procesarlos en consecuencia (independientemente del orden en que se alimentan) .El sitio continúa, señalando que el orden correcto de los argumentos debe ser:
fuente