Класс Decorator, который проверяет, не передана ли переменная экземпляра None - PullRequest
0 голосов
/ 01 октября 2019

У меня есть проблема, когда я пытаюсь создать простой декоратор класса, который проверяет наличие переданных переменных (то есть они не являются None). Проблема в том, что это делается внутри другого класса, поэтому проверяемые переменные относятся к self.. В основном я пытаюсь создать оболочку, которая перебирает заданные собственные переменные и проверяет, не являются ли они None.

class CheckForVariablesPresence:
  """Wrapper for checking if given variable(s) are not None.
  """

  def __init__(self, *variables):
    self.variables = variables

  def __call__(self, func):
    @wraps(func)
    def wrapper(*args, **kwargs):
      for variable in self.variables:
        if variable is None:
          raise KeyError(
            "Variable not found.\n",
            "Run the appropriate method first.",
          )

   return func(*args, **kwargs)

Дело в том, что я не могу передать self.variable в декоратор метода,поскольку я даже еще не создано.

@CheckForVariablesPresence(self.variable)
def __repr__(self):
  return str(self.variable)

Есть идеи, как я могу сделать это по-другому (и лучше)? Я начал с одной функции для проверки точной переменной, но проверяемые переменные растут и зависят от каждого иного метода, который я вызываю, поэтому я решил использовать оболочку, которая могла бы выполнять итерации по ним.

1 Ответ

0 голосов
/ 02 октября 2019

Самостоятельный ответ : Идея сделать это таким образом довольно плоха - как отметил @chepner в комментариях. Хотя я думаю, что он имел в виду делать что-то еще, я решил это по-другому (из-за ограничений того, как это должно было работать из-за другого модуля). В основном, метод __getattr__ - это то, что я искал, и я реализовал пользовательское сообщение AttributeError, когда был вызван атрибут, который доступен, но еще не инициализирован.

Это пример.

def __getattr__(self, name: str):
    value = self.__dict__.get(name)
    if value is None and name in self.__available_attributes:
        raise AttributeError(
            f"Attribute {name} not found. Run the appropriate method first or set it."
        )
    elif value is None:
        raise AttributeError(f"{self.__class__.__name__}.{name} is invalid")

    return value
...