我有一个来自图书馆的课程,请说MyClass
使用方法my_method
。
from MyLibrary import MyClass
obj = MyClass()
result = obj.my_method('arg')
我无法触及原始实现,但我想装饰my_method
,特别是我想检查返回值是否为not None
以及是否引发异常,如下所示:
result = obj.my_method('arg')
if result is None: raise ValueError()
这很无聊,因为我需要做很多次。特别是我不想在调用obj.my_method('arg')
时更改代码。我想:
def safe_method(self, *args):
result = self.my_method(*args)
if result is None: raise ValueError()
return result
MyClass.my_method = safe_method
这不起作用:
RuntimeError: maximum recursion depth exceeded while calling a Python object
我理解为什么,但我无法解决问题
答案 0 :(得分:2)
你可以像这样装饰它:
def safe_decorator(func):
def wrapper(self, *args):
result = func(self, *args)
if result is None:
raise ValueError()
return result
return wrapper
MyClass.my_method = safe_decorator(MyClass.my_method)
然后,您可以将此装饰器重用于任何类定义所需的任何方法。这就是@
符号或多或少的作用:)
希望这有帮助!
答案 1 :(得分:1)
def safe_method(self, *args):
result = self.my_method(*args)
if result is None: raise ValueError()
return result
MyClass.my_method = safe_method
上面发生的是你正在用另一种方法替换MyClass.my_method,而另一种方法又调用my_method。因此,您收到了递归错误。
试试这个:
MyClass._my_method = MyClass.my_method
def safe_method(self, *args):
result = self._my_method(*args)
if result is None:
raise ValueError()
return result
MyClass.my_method = safe_method