Python, argumentos de palabra clave predeterminados después de argumentos posicionales de longitud variable

Pensé que podría usar parámetros con nombre después de los parámetros posicionales de longitud variable en una llamada de función en Python 2, pero obtengo un SyntaxError al importar una clase de python. Estoy escribiendo con el siguiente método “obtener”, por ejemplo:

 class Foo(object): def __init__(self): print "You have created a Foo." def get(self, *args, raw=False, vars=None): print len(args) print raw print vars 

El error se ve así:

 def get(self, *args, raw=False, vars=None): ^ SyntaxError: invalid syntax 

Me gustaría poder llamar al método de varias maneras:

 f = Foo() f.get(arg1, arg2) f.get(arg1, raw=True) f.get(arg1, arg2, raw=True, vars=something) 

etc.

Funciona, pero solo en Python 3. Ver PEP 3102 . Al mirar los documentos “qué hay de nuevo”, parece que no hay un backport 2.x, por lo que no tiene suerte. Tendrá que aceptar los argumentos de las palabras clave ( **kwargs ) y analizarlos manualmente. Puede usar d.get(k, default) para obtener d[k] o default si no está allí. Para eliminar un argumento de kwargs , por ejemplo, antes de llamar al método de una súper clase, use d.pop .


Tenga en cuenta que en def get(self, *args, raw=False, vars=None): raw=False y vars=None no tienen nada que ver con los argumentos de palabras clave. Esos son valores de argumento por defecto. Los argumentos con un valor predeterminado pueden pasarse de manera posicional, y los argumentos sin un valor predeterminado pueden pasarse por palabra clave:

 def f(a=1): pass f(2) # works, passing a positionally def f(a): pass f(a=2) # works, passing a by keyword 

De manera similar, no se requiere que los argumentos de palabra clave tengan un valor predeterminado. Después del argumento *args es lo que los marca como palabras clave solamente, no la presencia de un valor predeterminado:

 def f(*args, a): pass # a is a mandatory, keyword-only argument 

La syntax de Python no permite argumentos variables en los argumentos de función y palabra clave con valor predeterminado al mismo tiempo. Si debe tener argumentos de palabras clave junto con un número arbitrario de argumentos posicionales, también debe permitir un número arbitrario de argumentos de palabras clave.

Este es un patrón común para proporcionar valores predeterminados para los argumentos de palabras clave, además de permitir cualquier número de argumentos posicionales:

 def foo(*args, **kwargs): raw = kwargs.pop('raw', False) vars = kwargs.pop('vars', None) 

Si no utiliza los argumentos de palabras clave adicionales, no tiene nada de qué preocuparse. Esto hace que la función sea un poco menos autodocumentada, que puede hacer con una cadena de documentos correctamente escrita.