在我的一些代码中,我正在使用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函数看起来,品味和闻起来像原始函数?
答案 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__
函数来拒绝写这些属性,但是如果你知道你不会尝试改变这些属性就没有必要。