2016-08-09 33 views
3

Das Paket joblib hat eine Funktion , die die an die Funktion übergebenen Argumente erfasst.Warum funktioniert `joblib.delayed` nicht als Dekorateur?

from joblib import delayed 

def f(n): 
    return n**2 

delayed(f)(2) 
# (<function f at 0x7f939eb3fe60>, (2,), {}) 
h = delayed(f) 
h(2) 
# (<function f at 0x7f939eb3fe60>, (2,), {}) 

Letztere Nutzung macht mich diese wie jede andere Dekorateur verwendet werden denken konnte: Es kann zum Beispiel wie folgt verwendet werden. Dies wird durch seine documentation unterstützt:

joblib.delayed (Funktion, check_pickle = True)

Decorator verwendet, um die Argumente einer Funktion zu erfassen.

Dies ist jedoch nicht:

from joblib import delayed 

@delayed 
def g(n): 
    return n**2 

# Traceback (most recent call last): 
# File "<stdin>", line 1, in <module> 
# File "/usr/lib/python2.7/dist-packages/joblib/parallel.py", line 158, in delayed 
# pickle.dumps(function) 
# File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
# raise TypeError, "can't pickle %s objects" % base.__name__ 
#TypeError: can't pickle function objects 

ich schon versucht, diese mit Python 2.7.12

Antwort

1

Es sieht aus wie es ein Namespace Problem ist, die joblib.delayed führt zu versuchen, die Ausgangsfunktion zu beizen (anstelle des ursprünglichen Funktion).

Ich habe nicht in den JOBLIB Code gesucht, aber das, was Sie die Art und Weise vorgeschlagen, wäre es zu tun:

import joblib 

def _func(*args, **kwargs): 
    'your code here' 

func = joblib.delayed(_func) 

Es ist nicht ideal, aber es funktioniert.