【发布时间】:2021-12-04 00:07:22
【问题描述】:
我遇到了一个实现问题。
class A(object):
"class a variables"
@execute
def worker(self):
try:
"do an ETL operation"
except Exception as e:
raise ETL exception
def letmehandleETLerrors(self):
pass
def letmehandleDataIntegrityErros(self):
pass
def letmehandleDataQualityErrors(self):
pass
def letmehandleDataUpdateErrors(self):
pass
def letmehandleDataDisplayErrors(self):
pass
我有一个类,在该类中,有一个名为 worker 的方法,它调用其他方法来进行一些数据处理。
我想要完成的是在我的应用程序中有一个集中的异常处理部分,我可以将所有异常处理和发布活动卸载到其中。我们有很多步骤和争论来验证数据,因此在所有地方进行异常处理变得乏味。因此,在一个名为 someExternalFile 的文件中,我概括地定义了我们的集中式异常处理:
class ETL_EXCEPTION(Exception):
pass
class execute(object):
def __init__(self,*args,**kwargs):
pass
def __call__(self,f):
@wraps(f)
def wrapped_f(*args):
try:
r = f(*args)
except ETL_EXCEPTION as etlEX:
" i would like to call ClassA.letmehandleETLerrors()"
pass
所以基本上任何时候在其他类的任何地方引发异常,我希望这个装饰器路由到适当的处理程序以顺利进行后期活动。这里的问题是我试图找到一种方法来引用装饰器范围内的 f 类实例。我可以像这样获得对类的引用:
self.currentclass = f.__globals__[f.__qualname__.split('.')[0]]
但是当我执行 self.currentclass.letmehandleETLerrors 时,它说 letmehandleETLerrors 需要一个名为 self 的位置参数,因此实际上它创建了一个我正在考虑的 ClassA 的新实例。
这可能吗,或者我应该从一个类中取出这个包装器并将其定义为一个方法并将 A 类传递给它?
【问题讨论】:
-
如果你没有在
execute.__init__中做任何事情,你不妨用一个与execute.__call__做同样事情的简单函数替换execute类。 -
wrapped_f已经获得了ClassA类型的值,即args[0]。
标签: python exception decorator wrapper