我有几个不同的类,它们的实例化成本相对较高,它们的方法可以正常工作,直到其中一个抛出,此时没有必要保留对象,因为状态以某种方式搞砸了。
我通常只会记住一个实例化对象的函数,但在这种情况下这不起作用,因为 memoize 装饰器只知道实例化时的对象,它不知道每个方法调用。
我该如何解决这个问题?是否可以创建一个装饰器来单独包装所有方法并在其中一个抛出时实例化一个新对象?
您可以使用dir(cls)
它来获取所有内容,并对其中的每个可调用项应用除装饰器之外的尝试...然后当您捕获异常时,在类上设置一个标志 (valid=False),然后引发错误。 ..然后memoize在返回之前检查那个标志......如果没有标志就返回......
至少这是我能想到的唯一方法......
您可以为实例添加“._valid”属性,然后在从缓存中返回它之前,您可以检查它是否为真。如果不将其视为缓存未命中。
我假设你的记忆器有一个内部功能,如:
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