Как получить собственные значения в декораторах из tasks.py - PullRequest
0 голосов
/ 02 января 2019

Мне нужна помощь, чтобы получить значения из класса внутри декоратора, я застреваю.

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 голосов
/ 02 января 2019

В вашей функции import_ экземпляр Importer является локальной переменной, а не аргументом функции, поэтому декоратор НЕ может получить к ней доступ. Период.

0 голосов
/ 02 января 2019

В файле import_.py, RECIPIENTS - это static variable класса Importer. Это означает, что переменная RECIPIENTS должна быть доступна с помощью <class-name>.<var-name>, что в данном случае равно Importer.RECIPIENTS.

Я бы предложил вам импортировать Importer из import_.py и печатать Importer.RECIPIENTS вместо self.RECIPIENTS.

Добавить эту строку в файл decorators.py

from import_ import Importer

и измените оператор печати с print self.RECIPIENTS на

print Importer.RECIPIENTS

Я написал простой пример, чтобы сделать эту работу.

foo.py

class Foo:
    VALUE = 'value'

    def __init__():
        pass

bar.py

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 мы получаем этот вывод.

$ python bar.py
value

Если вы не хотите добавлять дополнительную строку оператора импорта в верхней части каждого файла, для которого необходимо использовать значение RECIPIENTS, вы можете напрямую импортировать и печатать, как этот

print __import__('import_').Importer.RECIPIENTS

Однако нет другого способа получить доступ к значению из другого файла без его импорта.

...