【问题标题】:Why does `joblib.delayed` not work as decorator?为什么 `joblib.delayed` 不能用作装饰器?
【发布时间】:2016-08-09 09:00:33
【问题描述】:

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(function, 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试过这个

【问题讨论】:

    标签: python python-2.7 decorator python-decorators joblib


    【解决方案1】:

    看起来这是一个命名空间问题,导致 joblib.delayed 尝试腌制输出函数(而不是原始函数)。

    我还没有查看 joblib 代码,但您建议的方法是:

    import joblib
    
    def _func(*args, **kwargs):
        'your code here'
    
    func = joblib.delayed(_func)
    

    这并不理想,但它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多