1

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

我正在使用的库之一对函数使用自省来获取它需要的参数数量,但在装饰函数上失败。具体来说,它检查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 函数看起来、尝起来和闻起来都像原始函数?

4

2 回答 2

3

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

该库的内部结构非常丑陋(它使用了exec!),但它很好地封装了它们。

于 2012-06-25T19:36:18.650 回答
0

将其添加到您的memoized班级

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

所以它会将属性查找传递func_...给原始函数。

也许您还想编写一个__setattr__函数来拒绝写入这些属性,但如果您知道您不会尝试更改这些值,则没有必要。

于 2012-06-25T19:00:23.917 回答