如何从tasks.py的装饰器中获取自我价值

时间:2019-01-02 12:19:29

标签: python-2.7 python-decorators django-celery

我需要一些帮助来从装饰器中的类中获取值,但我一直陷于困境。

tasks.py

@lazy_task()
def import_(date_time):
  importer = Importer(date_time=date_time)
  importer.import_jira()

import_.py

class Importer(object):

   RECIPIENTS = 'friday@gmail.com'  

   def __init__(self, date_time=None):
     self.date_time = data_time

   def import_jira(self):
     pass

decorators.py

def lazy_task():

  def decorator(func):
    @wraps(func)
    def get_lazy_task(self, *args, **kwargs):            
        func(*args, **kwargs)
        print self.RECIPIENTS  # Not working            
    return get_lazy_task

  return decorator

请帮助我如何从文件RECIPIENTS中获取decorator中的import.py

2 个答案:

答案 0 :(得分:1)

在文件class Queue { constructor() { this.data = []; } toString() { console.log("Hello This is example"); } } const queue1 = new Queue(); console.log(queue1); 中,import_.py是类RECIPIENTS的{​​{1}}。这意味着static variable需要访问变量Importer,在这种情况下就是RECIPIENTS

我建议您从<class-name>.<var-name>导入Importer.RECIPIENTS并打印Importer而不是import_.py

将此行添加到文件Importer.RECIPIENTS

self.RECIPIENTS

并将打印语句从decorators.py更改为

from import_ import Importer

我写了一个简单的例子来完成这项工作。

foo.py

print self.RECIPIENTS

bar.py

print Importer.RECIPIENTS

在运行文件class Foo: VALUE = 'value' def __init__(): pass 时,我们得到此输出。

from functools import wraps
from foo import Foo  # importing class Foo from foo.py

def bar():
    def decorator(func):
        @wraps(func)
        def inner():
            print Foo.VALUE
        return inner
    return decorator

bar()(lambda: None)()

如果您不想在每个需要使用bar.py值的文件的顶部添加多余的import语句,则可以像这样直接导入并打印

$ python bar.py
value

但是,没有其他方法可以在不导入的情况下从另一个文件访问值。

答案 1 :(得分:-1)

import_函数中,Importer实例是一个局部变量-而不是函数的参数-因此,装饰器无法访问它。期间。