通常我会使用inspect.getargspec,但是如何获取已被绑定的方法的参数?
例如,如何获取方法'foo'的参数名称如下:
class Foo(object):
@memoized
def foo(self, arg1, arg2):
pass
请注意,Foo()。foo是一个记忆对象http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
这意味着它实际上是一个functools.partial实例。
如何获取原始函数或者以某种方式获取参数?
如果我不能,这是否表明PythonDecoratorLibrary的设计缺陷?
答案 0 :(得分:2)
您可以为部分添加_wrapped属性,这可能就是您已经执行的操作:
def __get__(self, obj, objtype):
"""Support instance methods."""
f = functools.partial(self.__call__, obj)
f._wrapped = self.func
return f
或者你可以返回self.func而不是partial如果obj是None(即如果它是从类而不是实例访问的话):
def __get__(self, obj, objtype):
"""Support instance methods."""
if obj is None:
return self.func
else:
return functools.partial(self.__call__, obj)
部分func
属性是memoized对象的__call__
方法。如果从Foo实例调用它,则第一个参数由partial设置为实例obj(请参阅Foo()。foo.args中的此内容)。然后在memoized.__call__
中,self.func(* args)就像一个穷人的绑定方法。
对于lru_cache,Raymond Hettinger将Python 2兼容的实现提供为ActiveState Code Recipes。除了最近最少使用的版本之外,还有一个最少使用的版本。