装饰器 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
我有一个问题,我试图创建一个简单的 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