如何获取任何python方法的参数?

时间:2011-09-22 04:00:08

标签: python decorator introspection

通常我会使用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的设计缺陷?

1 个答案:

答案 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。除了最近最少使用的版本之外,还有一个最少使用的版本。