2013-06-12 3 views
2

J'ai une fonction de tâche de céleri qui ressemble this-attributs Céleri personnalisé fonction de tâche

@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 

et my_custom_decorator ressemble à ce

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 

Je vois que cela est parce que l'objet appelable réel qui est invoqué pour exécuter la tâche est un objet de type classe de tâche céleri. Comment puis-je conserver mon attribut 'ltc' sur cet objet pour pouvoir y accéder à partir de la tâche comme indiqué ci-dessus i.e - my_task.ltc.some_func()?

Merci,

Répondre

0

Je pense que d'une façon facile de le faire serait d'introduire ltc comme paramètre mot-clé ..

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

peut-être de cette façon:

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 

Je ne Je ne sais pas s'il y a une tâche pour le céleri. J'espère que cela vous aide.

+0

Cela ne signifie-t-il pas que la fonction décorée doit prendre en argument ltc? – ksrini

+0

C'est. Et n'a pas de problèmes. Je suis désolé, je n'ai pas vérifié ce que tu faisais exactement. Le problème est que lorsque le code my_task est exécuté, le nom my_task pointe vers une autre fonction qui est retournée par '@ task', et cette fonction n'a pas d'attribut ltc. Vous devriez vérifier si '@ task' expose la fonction interne via un attribut. – tenuki

Questions connexes