¿Asterisco desnudo en argumentos de función?

¿Qué hace un asterisco en los argumentos de una función?

Cuando miré el módulo pickle, veo esto: (http://docs.python.org/3.3/library/pickle.html#pickle.dump)

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

Sé sobre un asterisco simple y doble que preceden 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 pickle. Probablemente sea solo un ejemplo de lo que está sucediendo. Sólo aprendí su nombre cuando envié esto al intérprete:

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

Si importa, estoy en Python 3.3.0.

Bare * se usa para forzar a la persona que llama a usar argumentos con nombre, por lo que no puede definir una función con * como argumento cuando no tiene los siguientes argumentos de palabras clave.

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

Mientras que la respuesta original responde la pregunta completamente, solo se agrega un poco de información relacionada. El comportamiento para el 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 por clave, deberá pasarlo explícitamente como key="value" .

 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'}