Внедрение свойств класса через декораторы - PullRequest
1 голос
/ 17 марта 2019

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

def setUp(self):
    self.property_1 = ##some logic
    ...

Я хотел переписать их как некоторую вспомогательную оболочку, которую можно внедрить в класс с помощью простого наследования или декоратора, например,

@with_property_1(x=1, y=2)
def setUp(self):
    ...


def with_property_1(**model_kwargs):
    def wrapper(f):
        def wrapped(*args, **kwargs):
            self = args[0]
            self.property_1 = ## logic
            f(*args, **kwargs)
        return wrapped
    return wrapper

, но проблема в том, что PyCharm нене признайте, что эти свойства экземпляра существуют, потому что ничто внутри самого класса TestCase никогда не устанавливает их.Есть ли еще какой-нибудь способ, которым я могу добиться этого, или способ заставить PyCharm признать эти свойства законными, учитывая наличие декоратора?

1 Ответ

0 голосов
/ 17 марта 2019

Отказ от ответственности: это не проверено.

Проблема здесь в том, что Python не может просто волшебным образом поместить self в контекст в декораторе (который не будет работать в любой IDE).Возможно, вы забыли, что self - это один из аргументов, передаваемых в каждый метод класса при его вызове.Поэтому он присутствует в вашем *args, и вы можете манипулировать им.

Вот мой пробный код:

def with_property_1(**model_kwargs):
  def wrapper(f):
    def wrapped(*args, **kwargs):
      for key, value in model_kwargs.items():
        setattr(args[0], key, value)
      f(*args, **kwargs)
    return wrapped
  return wrapper

Объяснение:

  1. Итерироватьнад каждым ключом / значением в **model_kwargs.

  2. Измените args[0], который должен быть переменной self, с помощью предоставленных kwargs, используя setattr.

  3. Вызовите функцию как обычно с обновленной переменной self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...