2013-06-12 4 views
2

У меня есть функция задачи сельдерея, которая выглядит как this-Сельдерей функция задачи пользовательских атрибутов

@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' на этом объекте, чтобы его можно было получить из задачи, как показано выше i.e - 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

Смежные вопросы