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

Tengo una función de Python que tiene 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 a h son cadenas que tienen diferentes significados. Es importante que pueda elegir qué parámetros opcionales para 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 fantástico 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 discrepancia de argumentos.

Ahora mismo 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 manera de hacer esto? ¿Podría pasar una lista en lugar de la lista de argumentos?

Ahora mismo el prototipo que usa 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] 

Intente 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.

Simplemente use el parámetro * args, que le permite pasar tantos argumentos como desee después de a,b,c . Tendría que agregar algo de lógica para asignar 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, puedes usar el argumento de Kwargs y luego puedes nombrar tus 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 los kwargs tendrían un diccionario de todos los parámetros que tienen un valor clave después de a,b