2013-06-12 174 views
2

我有芹菜任务功能,看起来像这 -芹菜任务功能的自定义属性

@task(base=MyBaseTask) 
@my_custom_decorator 
def my_task(*args, **kwargs): 
    my_task.ltc.some_func() #fails - attribute ltc doesn't exist on the object 

和my_custom_decorator看起来像这样

def my_custom_decorator (f): 
    from functools import wraps 
    ltc = SomeClass() 
    @wraps(f) 
    def _inner(*args, **kwargs): 
     ret_obj = None 
     try: 
      f.task_cache = ltc 
      ret_obj = f(*args, **kwargs) 
     except Exception, e: 
      raise 
     return ret_obj 
    _inner.ltc = ltc 
    return _inner 

我看,这是因为实际的可调用的对象,被调用来执行任务的是celery任务类的对象。 如何在此对象上保留我的属性'ltc',以便可以从任务中访问,如上所示 - 即my_task.ltc.some_func()

感谢,

回答

0

我想一个简单的方法来做到这将是引进ltc作为关键字参数..

@task(base=MyBaseTask) 
@my_custom_decorator 
def my_task(*args, **kwargs): 
    ltc = kwargs['ltc'] 
    ltc.some_func() 

也许是这样的:

def my_custom_decorator (f): 
    from functools import wraps 
    ltc = SomeClass() 
    @wraps(f) 
    def _inner(*args, **kwargs): 
     ret_obj = None 
     try: 
      f.task_cache = ltc 
      kwargs['ltc'] = ltc 
      ret_obj = f(*args, **kwargs) 
     except Exception, e: 
      raise 
     return ret_obj 
    _inner.ltc = ltc 
    return _inner 

我不不知道是否有芹菜的任务方式来做到这一点。希望这可以帮助你。

+0

这不是说装饰函数应该把ltc作为参数吗? – ksrini

+0

是的。并没有问题。对不起,我没有检查你到底在做什么。问题是当执行my_task代码时,名称my_task指向由@ @ task返回的其他函数,并且该函数没有ltc属性。你应该检查'@ task'是否通过某些属性暴露了内部函数.. – tenuki