python - 装饰器类,它检查传递的实例变量是否不是 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)
任何想法我可以如何以不同的方式(更好)做到这一点?我从一个检查确切变量的函数开始,但检查的变量正在增长,并且取决于我正在调用的每个不同的方法,因此我想使用可以迭代它们的包装器的原因。
解决方案
自我回答:以这种方式这样做的想法非常糟糕 - 正如@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
推荐阅读
- c - 如何获取设备驱动程序的句柄
- xamarin.forms - 如何使用 Xamairn 表单拨打电话?
- sql-server - 使用 SQL Server 打印一个句子说一年中的哪一天
- javascript - 为什么 i 在 "for (let i..."
- scala - 带有 Http 请求的断路器 monix
- python-3.x - 比较两个列表列表,在保持结构的同时只保留匹配的元素
- mongodb - MongoDB:对数组中对象中值==“某些字符串”的次数求和
- dataframe - 为分组的火花数据框选择最旧的列
- r - 将单词分解成字母模式:代码未按预期工作
- apache-kafka - 配置 Apache Kafka 接收器 jdbc 连接器