Python 为什么'joblib.delayed'不是装饰师?

Python 为什么'joblib.delayed'不是装饰师?,python,python-2.7,decorator,python-decorators,joblib,Python,Python 2.7,Decorator,Python Decorators,Joblib,包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,), {}) 来自joblib的导入延迟

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,), {})
来自joblib的
导入延迟
def f(n):
返回n**2
延迟(f)(2)
# (, (2,), {})
h=延迟(f)
h(2)
# (, (2,), {})
后一种用法使我认为它可以像其他装饰师一样使用。这一点得到了以下方面的支持:

作业库延迟(函数,检查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
来自joblib的
导入延迟
@耽搁
def g(n):
返回n**2
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#文件“/usr/lib/python2.7/dist packages/joblb/parallel.py”,第158行,延迟
#pickle.dumps(函数)
#文件“/usr/lib/python2.7/copy_reg.py”,第70行,在
#raise TypeError,“无法pickle%s对象”%base.\u\n__
#TypeError:无法pickle函数对象

我用Python2.7.12尝试了这一点,看起来这是一个名称空间问题,它导致
joblib.delayed
尝试pickle输出函数(而不是原始函数)

我没有研究过joblib代码,但您提出的方法是:

import joblib

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

func = joblib.delayed(_func)
这并不理想,但很有效