funciones argumentos argumento python function arguments kwargs pass-by-name

argumentos - Python: pasar parámetros por nombre junto con kwargs



kwargs python (2)

Es posible al menos para Python 2.7. Los argumentos de palabras clave se asignan a los parámetros posicionales por nombre, por lo que puede hacer

In [34]: def func(name, lname, **kwargs): print ''name=''+name, ''lname=''+lname print kwargs ....: In [35]: func(lname=''lname_val'', name=''name_val'', city=''cityName'', otherInfo=''blah'') name=name_val lname=lname_val {''city'': ''cityName'', ''otherInfo'': ''blah''}

Los documentos oficiales lo dicen así: "Si hay argumentos de palabras clave presentes, primero se convierten en argumentos posicionales, de la siguiente manera. Primero, se crea una lista de espacios vacíos para los parámetros formales. Si hay N argumentos posicionales, se colocan en las primeras ranuras N. A continuación, para cada argumento de palabra clave, el identificador se usa para determinar la ranura correspondiente (si el identificador es el mismo que el primer nombre de parámetro formal, se usa la primera ranura, y así sucesivamente). ya completado, se genera una excepción TypeError. De lo contrario, el valor del argumento se coloca en la ranura, llenándolo (incluso si la expresión es Ninguna, llena la ranura) ". https://docs.python.org/2/reference/expressions.html#calls

En python podemos hacer esto:

def myFun1(one = ''1'', two = ''2''): ...

Luego podemos llamar a la función y pasar los argumentos por su nombre:

myFun1(two = ''two'', one = ''one'')

Además, podemos hacer esto:

def myFun2(**kwargs): print kwargs.get(''one'', ''nothing here'') myFun2(one=''one'')

Así que me preguntaba si es posible combinar ambos métodos como:

def myFun3(name, lname, **other_info): ... myFun3(lname=''Someone'', name=''myName'', city=''cityName'', otherInfo=''blah'')

En general ¿qué combinaciones podemos hacer?

Gracias y lo siento por mi pregunta tonta.


La idea general es:

def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs): ...

Puedes usar tantos como quieras. Los * y ** ''absorberán'' cualquier valor restante que no se haya contabilizado de otra manera.

Los argumentos posicionales (proporcionados sin valores predeterminados) no pueden darse por palabra clave, y los argumentos no predeterminados no pueden seguir los argumentos predeterminados.

Note que Python 3 también agrega la capacidad de especificar argumentos de solo palabras clave al tenerlos después de * :

def func(arg1, arg2, *args, kwonlyarg=default): ...

También puede usar * alone ( def func(a1, a2, *, kw=d): que significa que no se capturan argumentos, pero cualquier cosa después es solo de palabra clave.

Entonces, si está en 3.x, podría producir el comportamiento que desea con:

def myFun3(*, name, lname, **other_info): ...

Lo que permitiría llamar con name y lname como palabra clave.

Tenga en cuenta que esta es una interfaz inusual, que puede ser molesta para el usuario; solo lo usaría en casos de uso muy específicos.

En 2.x, necesitarías hacer esto manualmente analizando **kwargs .