【问题标题】:Memoize class instance until one of its methods throws记忆类实例,直到其方法之一抛出
【发布时间】:2012-08-30 22:37:43
【问题描述】:

我有几个不同的类,它们的实例化成本相对较高,并且它们的方法可以正常工作,直到其中一个抛出,此时保留对象是没有意义的,因为状态在某种程度上被搞砸了。

我通常只会记住一个实例化对象的函数,但在这种情况下这不起作用,因为 memoize 装饰器只知道实例化时的对象,它不知道每个方法调用。

我该如何解决这个问题?是否可以创建一个装饰器,单独包装所有方法并在其中一个抛出时实例化一个新对象?

【问题讨论】:

  • 这些是抓到还是没抓到?
  • 有时被抓,有时未被抓。我绝对希望这取决于来电者。这里的关键是,如果最后一次调用没有抛出异常,则应该再次使用调用该方法的对象。

标签: python decorator


【解决方案1】:

您可以使用dir(cls) 来获取所有内容,并对其中的每个可调用项目应用除装饰器之外的尝试...然后当您捕获异常时在类上设置一个标志(有效=假)然后引发错误...然后 memoize 在返回之前检查该标志...如果没有标志就返回...

至少这是我能想到的唯一方法......

【讨论】:

    【解决方案2】:

    我假设你的记忆器有一个内部功能,如:

    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
    

    【讨论】:

      【解决方案3】:

      您可以为实例添加“._valid”属性,在从缓存中返回它之前,您可以检查它是否为真。如果不将其视为缓存未命中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-20
        • 2011-05-24
        • 2012-06-08
        • 2018-12-10
        • 2013-05-26
        • 1970-01-01
        • 2018-04-16
        • 2015-02-17
        相关资源
        最近更新 更多