2015-09-25 9 views
5

Wenn ich meine Funktion definieren, wie unten:Wie verpackte Funktionen mit functools.partial vergleichen?

def myfunc(arg1, arg2): 
    pass 

dann myfunc == myfunc Rückkehr True

Aber functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1)False zurück.

Gibt es für den Komponententest eine einfache Möglichkeit zu testen, ob die Teilfunktion diejenige ist, die ich erwarte?

Antwort

8

testen, ob die func, args und keywords Attribute sind die gleichen:

p1.func == p2.func and p1.args == p2.args and p1.keywords == p2.keywords 

wo p1 und p2 sind beide partial() Objekte:

>>> from functools import partial 
>>> def myfunc(arg1, arg2): 
...  pass 
... 
>>> partial(myfunc, arg2=1).func == partial(myfunc, arg2=1).func 
True 
>>> partial(myfunc, arg2=1).args == partial(myfunc, arg2=1).args 
True 
>>> partial(myfunc, arg2=1).keywords == partial(myfunc, arg2=1).keywords 
True 

Es gab eine bug filed in the Python tracker Gleichheit Tests partial hinzufügen Objekte, die im Wesentlichen das tut, aber es wurde mit der Begründung zurückgewiesen, dass kein __eq__ Methode Schatten das Verhalten von Funktionen, die auch nur dann gleich sind, wenn ihre übereinstimmt.

+1

Gibt es einen guten Grund, warum 'functools.partial' Objekte das nicht im Standard' __eq__' implementieren? – doublep