¿Qué hace un asterisco simple en una lista de parámetros? ¿Qué son los parámetros de "sólo palabras clave"?

Resuelto Eric asked hace 11 años • 5 respuestas

¿Qué hace un asterisco desnudo en los parámetros de una función?

Cuando miré el módulo pickle , veo esto:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

Conozco asteriscos simples y dobles que preceden a los parámetros (para un número variable de parámetros), pero esto no precede a nada. Y estoy bastante seguro de que esto no tiene nada que ver con los pepinillos. Probablemente sea sólo un ejemplo de cómo esto sucede. Sólo supe su nombre cuando le envié esto al intérprete:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

Si es importante, estoy en Python 3.3.0.

Eric avatar Jan 13 '13 15:01 Eric
Aceptado

Bare *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.

Consulte esta respuesta o la documentación de Python 3 para obtener más detalles.

Kimvais avatar Jan 13 '2013 08:01 Kimvais

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:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

    def compare(a, b, *, key=None):
        ...

En inglés simple, significa que para pasar el valor de la clave, deberá pasarlo explícitamente como key="value".

Anshul Goyal avatar Sep 02 '2016 04:09 Anshul Goyal
def func(*, a, b):
    print(a)
    print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

el ejemplo anterior con **kwargs

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
laycat avatar Oct 22 '2018 19:10 laycat