2010-08-20 4 views
8

Ich suche nach einer Möglichkeit, die Anzahl der Argumente zu überprüfen, die eine bestimmte Funktion in Python übernimmt. Der Zweck besteht darin, eine robustere Methode zu finden, meine Klassen für Tests zu patchen. Also, ich möchte so etwas tun:Gibt es eine Möglichkeit, die Signatur einer Funktion in Python zu überprüfen?

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! 

Danke.

+0

"meine Klassen für Tests Patchen"? Warum benutzt du keine Mock-Objekte? http://python-mock.sourceforge.net/? –

+1

Ich bin neu mit Mocks. Ich "wuchs" Stubben und Flicken. Ich werde üben und herausfinden, wann ich welches verwenden soll, aber in der Zwischenzeit habe ich noch Projekte zu beenden und Tests zu schreiben :). – mjumbewu

Antwort

9

können Sie verwenden:

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

Dies wird mit variabler Länge Parameter nicht erkennen, wie:

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

Das Modul inspect ermöglicht es Ihnen, die Argumente einer Funktion zu untersuchen. Dies wurde einige Male auf Stack Overflow gestellt; versuche nach einigen dieser Antworten zu suchen. Zum Beispiel:

Getting method parameter names in python

+0

Ich sehe. Ich habe ein wenig gesucht, bevor ich gepostet habe, aber ich denke, ich sollte mehr Suchbegriffe verwenden. Entschuldigung für die Mühe. – mjumbewu

+0

Kein Problem. Es ist besser, auf die anderen Antworten zu verweisen, als einfach alles hier zu wiederholen. –

Verwandte Themen