2012-03-02 32 views
63

Tengo una función de Python que toma varios argumentos. Algunos de estos argumentos podrían omitirse en algunos escenarios.¿Cómo creo una función de Python con argumentos opcionales?

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

Los argumentos d través de 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 elecciones).

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

Ahora 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 simplemente 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 utilizando ctypes se ve algo 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] 
+0

relacionada: [¿qué hace ** (estrella doble/asterisco) y * (estrella/asterisco) hacen para los parámetros ?] (https://stackoverflow.com/q/36901/3357935) –

Respuesta

74

Trate llamándolo 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.

94

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

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


Del mismo modo se podría utilizar el argumento kwargs y luego puede nombrar a su 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 kwargs tendría un diccionario de todos los parámetros que son clave valorada después a,b

+0

Gracias. Si bien no puedo usar tanta flexibilidad en mi código, y no resuelve mi problema de llamadas 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 contento. – Thalia

+5

Se llama [Arbitrary Argument Lists] (http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – FabienB

Cuestiones relacionadas