¿Cómo puedo crear una función Python con argumentos opcionales?


Tengo una función 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 d hasta h son cadenas que cada una tiene significados diferentes. 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 (estos son mis opciones).

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

Ahora mismo estoy enviando cadenas vacías en lugar de los primeros argumentos que faltan como marcadores de posición. Me gustaría poder llamar a una función usando valores reales.

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

En este momento el prototipo usando ctypes se ve algo así como:

_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]
Author: Steven Vascellaro, 2012-03-03

2 answers

Intenta llamarlo 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.

 85
Author: Russell Borogove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-02 20:32:31

Simplemente use el parámetro *args, que le permite pasar tantos argumentos como desee después de su a,b,c. Tendrías que añadir algo de lógica al mapa args - >c, d,e, f pero es una" manera " de sobrecargar.

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

Y se imprimirá c,d,e,f


De manera similar, podría usar el argumento kwargs 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 entonces kwargs tendría un diccionario de todos los parámetros que son clave valorados después de a,b

 111
Author: Nix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-02 20:50:07