装饰器 class 检查传递的实例变量是否不是 None

Decorator class which checks if passed instance variable is not None

我有一个问题,我试图创建一个简单的 Class 装饰器来检查传递的变量是否存在(即它们不是 None)。问题是,这是在另一个 class 中完成的,因此检查的变量来自 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,因为 self 还没有创建。

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

有什么想法可以让我以不同的方式(或更好地)做到这一点吗?我从一个函数开始检查确切的变量,但是检查的变量在增长并且取决于我调用的每个和不同的方法,因此我想使用一个可以迭代它们的包装器的原因。

自我回答:以这种方式这样做的想法非常糟糕——正如@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