2016-08-09 3 views
3

В пакете joblib есть функция delayed, которая захватывает аргументы, переданные функции. Его можно использовать, например, так:Почему `joblib.delayed` не работает как декоратор?

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,), {}) 

Последнее использование заставляет меня думать, что это можно использовать, Это подтверждается ИТС documentation:

joblib.delayed (функция, check_pickle = True)

декоратор используется для захвата аргументы функции.

Однако это не удается:

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 

Я попытался это с Python 2.7.12

ответ

1

Это выглядит, как будто это проблема пространства имен, которое вызывает joblib.delayed пытаться законсервировать функцию вывода (вместо оригинала функция).

Я не смотрел в код joblib, но то, что вы предложили бы способ сделать это:

import joblib 

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

func = joblib.delayed(_func) 

Это не идеально, но это работает.

Смежные вопросы