需要记忆功能才能像功能一样嘎嘎叫

时间:2012-06-25 18:54:18

标签: python memoization

在我的一些代码中,我正在使用Python装饰器库中的漂亮memoized类。

我正在使用的一个库在函数上使用内省来获取它所需的参数数量,并且在修饰函数上失败。具体来说,它会检查co_argcount变量。

if (PyInt_AsLong(co_argcount) < 1) {
      PyErr_SetString(PyExc_TypeError, "This function has no parameters to mini\
mize.");

似乎argcount没有被转移到memoized函数。

>>> def f(x):
...     return x
... 
>>> f.func_code.co_argcount
1
>>> g = memoized(f)
>>> g.func_code.co_argcount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'memoized' object has no attribute 'func_code'

如何修改memoized类,以便我的memoized函数看起来,品味和闻起来像原始函数?

2 个答案:

答案 0 :(得分:3)

您需要创建一个签名保留装饰器。最简单的方法是使用库http://pypi.python.org/pypi/decorator,它负责为您保留签名。

库的内部非常难看(它使用 exec !)但是它很好地封装了它们。

答案 1 :(得分:0)

将其添加到memoized班级

def __getattr__(self, name):
    if name.startswith('func_'):
        return getattr(self.func, name)
    raise AttributeError

因此它会将func_...的属性查找传递给原始函数。

也许你也想写一个__setattr__函数来拒绝写这些属性,但是如果你知道你不会尝试改变这些属性就没有必要。