que opcionales funciones argumentos arg python

funciones - argumentos opcionales python



pasar el argumento de** kwargs a otra funciĆ³n con** kwargs (4)

No entiendo el siguiente ejemplo, digamos que tengo estas funciones:

# python likes def save(filename, data, **kwargs): fo = openX(filename, "w", **kwargs) # <- #1 fo.write(data) fo.close() # python doesnt like def save2(filename, data, **kwargs): fo = openX(filename, "w", kwargs) # <- #2 fo.write(data) fo.close() def openX(filename, mode, **kwargs): #doing something fancy and returning a file object

¿Por qué el # 1 es la solución correcta y el # 2 el equivocado? **kwargs es básicamente un dict, así que si quiero pasar el argumento a openX, creo que la forma correcta sería sin ** y simplemente dando el dict. Pero obviamente Python no le gusta el segundo y me dice que di 3 en lugar de 2 argumentos. Entonces, ¿cuál es la razón detrás de esto?


En el segundo ejemplo, proporciona 3 argumentos: nombre de archivo, modo y un diccionario ( kwargs ). Pero Python espera: 2 argumentos formales más argumentos de palabra clave.

Al anteponer el diccionario por ''**'', descomprimimos los kwargs del diccionario en argumentos de palabras clave.

Un diccionario (tipo dict ) es una variable única que contiene pares clave-valor.

Los "argumentos de palabra clave" son parámetros de método de valor clave.

Cualquier diccionario puede desempaquetar a los argumentos de las palabras clave prefijándolo con ** durante la llamada a la función.


La sintaxis ** le dice a Python que recolecte argumentos de palabras clave en un diccionario. save2 lo pasa como un argumento que no es de palabra clave (un objeto de diccionario). El openX no está viendo ningún argumento de palabra clave por lo que **args no se usa. En su lugar, obtiene un tercer argumento que no es una palabra clave (el diccionario). Para arreglar eso cambia la definición de la función openX .

def openX(filename, mode, kwargs): pass


Para # 2 args será solo un parámetro formal con valor dict, pero no un parámetro de tipo palabra clave.

Si desea pasar un parámetro de tipo de palabra clave a un argumento de palabra clave, debe especificar ** antes de su diccionario, lo que significa ** args

mira esto para más detalles sobre el uso de ** kw

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/


Porque un diccionario es un valor único. Debe usar la expansión de palabras clave si desea pasarlo como un grupo de argumentos de palabra clave.