2010-08-20 9 views
8

Estoy buscando una forma de verificar el número de argumentos que una función determinada tiene en Python. El objetivo es lograr un método más sólido para aplicar parches a mis clases para las pruebas. Entonces, quiero hacer algo como esto:¿Hay alguna manera de verificar la firma de una función en Python?

class MyClass (object): 
    def my_function(self, arg1, arg2): 
     result = ... # Something complicated 
     return result 

def patch(object, func_name, replacement_func): 
    import new 

    orig_func = getattr(object, func_name) 
    replacement_func = new.instancemethod(replacement_func, 
          object, object.__class__) 

    # ... 
    # Verify that orig_func and replacement_func have the 
    # same signature. If not, raise an error. 
    # ... 

    setattr(object, func_name, replacement_func) 

my_patched_object = MyClass() 
patch(my_patched_object, "my_function", lambda self, arg1: "dummy result") 
# The above line should raise an error! 

Gracias.

+0

"remendar mis clases de pruebas"? ¿Por qué no usas objetos simulados? http://python-mock.sourceforge.net/? –

+1

Soy nuevo en el uso de simulacros. "Crecí" tropezando y reparando. Estoy practicando y averiguando cuándo usarlo, pero mientras tanto, todavía tengo proyectos para terminar y pruebas para escribir :). – mjumbewu

Respuesta

9

que puede utilizar:

import inspect 
len(inspect.getargspec(foo_func)[0]) 

Esto no va a reconocer los parámetros de longitud variable, como:

def foo(a, b, *args, **kwargs): 
    pass 
2

El módulo inspect le permite examinar los argumentos de una función. Esto se ha preguntado algunas veces en Stack Overflow; intente buscar algunas de esas respuestas. Por ejemplo:

Getting method parameter names in python

+0

Ya veo. Hice un poco de búsqueda antes de publicar, pero creo que debería haber usado más términos de búsqueda. Disculpa por la molestia. – mjumbewu

+0

No hay problema. Es mejor señalar las otras respuestas, que simplemente repetir todo aquí. –

Cuestiones relacionadas