¿Cómo creo una función de Python con argumentos opcionales?

218

Tengo una función de Python que toma varios argumentos. Algunos de estos argumentos podrían omitirse en algunos escenarios.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Los argumentos da través hson cadenas que tienen cada uno diferentes significados. Es importante que pueda elegir qué parámetros opcionales pasar en cualquier combinación. Por ejemplo, (a, b, C, d, e)o (a, b, C, g, h), o (a, b, C, d, e, f, o todos ellos (estas son mis opciones).

Sería genial si pudiera sobrecargar la función, pero leí que Python no admite la sobrecarga. Intenté insertar algunos de los argumentos int requeridos en la lista, y obtuve un error de desajuste de argumento.

En este momento estoy enviando cadenas vacías en lugar de los primeros argumentos faltantes como marcadores de posición. Me gustaría poder llamar a una función simplemente usando valores reales.

¿Hay alguna forma de hacer esto? ¿Podría pasar una lista en lugar de la lista de argumentos?

En este momento, el prototipo que usa ctypes se parece a:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
Thalia
fuente

Respuestas:

194

Trate de llamar a ella como: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Después de los argumentos posicionales requeridos, puede especificar argumentos opcionales específicos por nombre.

Russell Borogove
fuente
246

Simplemente use el *argsparámetro, que le permite pasar tantos argumentos como desee después de su a,b,c. Tendría que agregar algo de lógica al mapa args-> c,d,e,fpero es una "forma" de sobrecarga.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

E imprimirá valores de c,d,e,f


Del mismo modo, podría usar el kwargsargumento y luego podría nombrar sus parámetros.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

Y luego kwargstendría un diccionario de todos los parámetros que tienen un valor clave despuésa,b

Nada
fuente
Gracias. Si bien no puedo usar tanta flexibilidad en mi código, y no resuelve mi problema de llamar con varios agujeros vacíos en mi lista, es una gran herramienta para usar en un proyecto diferente. y Russel Borogove me dio la respuesta exacta que necesitaba para mi problema, estoy feliz.
Thalia
12
Se llama Listas de argumentos arbitrarios
FabienB
@Nix, me gusta mucho tu respuesta. Sin embargo, ¿podría aclarar para qué c = kwargs.get('c', None)se utiliza la declaración ? ¿Se requiere en todas las funciones que tienen argumentos opcionales? En su código, solo tenía 2 argumentos opcionales. ¿Qué pasa si el usuario quiere decir otro argumento e? ¿Cómo puedo alterar su código de muestra para cualquier número desconocido de argumentos opcionales, por ejemplo def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...):? ¿Tengo que incluir c = kwargs.get('c', None) etcantes de hacer el obj.add(c, d, ...)?
Nemo
Si le preocupa la complejidad del tiempo. Esto sería un problema
NduJay