首页 > 解决方案 > 装饰器类,它检查传递的实例变量是否不是 None

问题描述

我有一个问题,我正在尝试创建一个简单的类装饰器来检查传递的变量是否存在(即它们不是无)。问题是,这是在另一个类中完成的,所以检查的变量来自self.. 基本上我正在尝试创建一个包装器,它迭代给定的自变量并检查它们是否不是无。

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)

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

标签: pythonclassdecoratorpython-decorators

解决方案


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

推荐阅读