2013-06-12 211 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