2015-09-25 8 views
5

Se io definisco la mia funzione come di seguito:Come confrontare le funzioni avvolte con functools.partial?

def myfunc(arg1, arg2): 
    pass 

poi myfunc == myfunc tornerà True

Ma functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1) tornerà False.

Per motivi non contrattuali, esiste un modo semplice per verificare se la funzione parziale è quella che mi aspetto?

risposta

8

test se gli attributi func, args e keywords sono gli stessi:

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

dove p1 e p2 sono entrambi partial() oggetti:

>>> 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 

C'era un bug filed in the Python tracker per aggiungere test di uguaglianza di partial oggetti che lo fanno essenzialmente, ma è stato respinto perché non aveva unIl metodoombreggia il comportamento delle funzioni, che sono uguali solo se corrispondono a id().

+1

C'è qualche buona ragione per cui gli oggetti 'functools.partial' non lo implementano nello standard' __eq__'? – doublep