una script procedimientos posicional pasar parametros parametro opcionales lista funciones explicacion ejecutar con como argumentos argumento python variadic-functions python-2.x named-parameters default-parameters

script - kwargs python explicacion



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

Pensé que podría usar parámetros nombrados después de los parámetros de posición de longitud variable en una llamada a 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 echar un vistazo a los documentos "qué hay de nuevo", parece que no hay soporte 2.x, por lo que no tiene suerte. Tendrá que aceptar cualquier argumento de palabra clave ( **kwargs ) y analizarlo manualmente. Puedes usar d.get(k, default) para obtener d[k] o por default si eso no está allí. Para eliminar un argumento de kwargs , por ejemplo, antes de llamar a un método de d.pop , 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 palabra clave. Esos son valores de argumento predeterminados. Los argumentos con un valor predeterminado se pueden pasar posicionalmente, y los argumentos sin un valor predeterminado se pueden pasar 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

Del mismo modo, los argumentos de palabra clave no son necesarios para tener un valor predeterminado. Después del argumento *args es lo que los marca como palabra clave solamente, no la presencia de un valor predeterminado:

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


La sintaxis de Python no permite args variables en función y argumentos de palabras clave con valor predeterminado al mismo tiempo. Si debe tener argumentos de palabras clave junto con una cantidad arbitraria de argumentos posicionales, también debe permitir el uso de una cantidad arbitraria de argumentos de palabra clave.

Este es un patrón común para proporcionar valores predeterminados para los argumentos de palabra clave, así como para permitir cualquier cantidad de argumentos posicionales:

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

Si no usa los argumentos de palabras clave adicionales, no tiene de qué preocuparse. Esto hace que la función sea un poco menos auto-documentada, lo que puede compensar con una docstring escrita correctamente.