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 d
a través h
son 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]
Respuestas:
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.fuente
Simplemente use el
*args
parámetro, que le permite pasar tantos argumentos como desee después de sua,b,c
. Tendría que agregar algo de lógica al mapaargs
->c,d,e,f
pero es una "forma" de sobrecarga.E imprimirá valores de
c,d,e,f
Del mismo modo, podría usar el
kwargs
argumento y luego podría nombrar sus parámetros.Y luego
kwargs
tendría un diccionario de todos los parámetros que tienen un valor clave despuésa,b
fuente
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 argumentoe
? ¿Cómo puedo alterar su código de muestra para cualquier número desconocido de argumentos opcionales, por ejemplodef 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 incluirc = kwargs.get('c', None) etc
antes de hacer elobj.add(c, d, ...)
?