我有几个不同的类,它们实例化起来相对昂贵,并且它们的方法工作正常,直到其中一个抛出,此时保持对象没有意义,因为状态以某种方式搞砸了。
我通常只会记住一个实例化对象的函数,但是在这种情况下这不起作用,因为memoize装饰器只知道实例化时的对象,它不知道每个方法调用。 / p>
我该如何解决这个问题?是否有可能创建一个单独包装所有方法的装饰器,并在其中一个方法抛出时实例化一个新对象?
答案 0 :(得分:0)
你可以使用dir(cls)
来获取它上面的所有内容并在其中的每个项目中应用除装饰器之外的try可调用...然后当你捕获异常时在类上设置一个标志(valid = False)然后提出错误...然后memoize在返回之前检查那个标志...如果没有标志就返回...
至少这是我能想到的唯一方法......
答案 1 :(得分:0)
我假设你的memoizer有一个内部函数,如:
def memocall(function, *args, **kwargs):
try:
return cache[(args, kwargs)]
except KeyError:
result = function(*args, **kwargs)
cache[(args, kwargs)] = result
return result
稍微改变一下:
def memocall(function, *args, **kwargs):
try:
return cache[(args, kwargs)]
except KeyError:
try:
result = function(*args, **kwargs)
except:
cache = {} # Clear the cache
raise # Re-throw the exception
cache[(args, kwargs)] = result
return result
答案 2 :(得分:0)
您可以向实例添加“._ invalid”属性,在从缓存中返回之前,您可以检查它是否为真。如果不将其视为缓存未命中。