2016-06-17 13 views
0

Ich möchte die Funktionsaufrufe innerhalb einer Funktion abfangen. Dies zielt darauf ab, eine "spöttische" Art von Effekt auf Funktionsaufrufe innerhalb einer Funktion zu erzeugen.Abfangen Funktionsaufrufe ausgehen von einer Funktion Python

Zum Beispiel:

def calls_add(a,b): 
    print "this function calls add" 
    c = add(a,b) 
    print "call to add returned",c 

Ich mag würde ein Dekorateur oben auf call_add hinzuzufügen, anstatt eine andere Funktion abfangen Anrufe an die Funktion hinzufügen, und rufen Sie (mit den gleichen Argumenten geführt wird hinzuzufügen)

Etwas wie folgt aus:

def some_other_func(*args,**kwargs): 
    return "test value" 

@mock(add,some_other_func) 
def calls_add(a,b): 
    print "this function calls add" 
    c = add(a,b) 
    print "call to add returned",c 

gibt es eine Möglichkeit, dies den Code von calls_add zu berühren, ohne zu tun. Ich habe die inspect-Bibliothek angeschaut, brauche aber Hilfe.

Antwort

0

Ich glaube, Sie suchen unittest.mock.patch:

Patch() fungiert als Funktion Dekorateur, Klasse Dekorateur oder einem Kontext-Manager. Im Körper der Funktion oder mit der Anweisung wird das Ziel mit einem neuen Objekt gepatcht. Wenn die Funktion/with-Anweisung beendet wird, wird der Patch rückgängig gemacht.

Von der API here und Dokumentation here

0

Sie haben mock.patch zu verwenden. Sie haben folgende zwei posiblities:

  1. Wenn Sie einen Dekorateur verwenden möchten:

    import mock 
    
    
    def some_other_func(*args, **kwargs): 
        return "test value" 
    
    
    def add(a, b): 
        return a + b 
    
    
    @mock.patch("__main__.add", some_other_func) 
    def calls_add(a, b): 
        print "this function calls add" 
        c = add(a, b) 
        print "call to add returned", c 
    
    
    calls_add(1, 2) 
    
  2. Wenn Sie einen Dekorateur nicht verwenden möchten:

    import mock 
    
    
    def some_other_func(*args, **kwargs): 
        return "test value" 
    
    
    def add(a, b): 
        return a + b 
    
    
    def calls_add(a, b): 
        print "this function calls add" 
        c = add(a, b) 
        print "call to add returned", c 
    
    
    calls_add(1, 2) 
    
    with mock.patch("__main__.add", some_other_func): 
        calls_add(1, 2)