【问题标题】:How do I get the arguments for any python method?如何获取任何 python 方法的参数?
【发布时间】:2011-11-22 11:45:48
【问题描述】:

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

【问题讨论】:

  • 我已经通过有效地编写自己的 Memoize 替换来解决这个问题,它允许我获得原始功能,但是这个问题仍然存在。
  • eryksun:我确实为部分添加了一个 _wrapped 属性,虽然这看起来很奇怪,因为它已经有一个 .func (这似乎是一个咖喱函数?),但是 'return self.func 代替如果 obj 为 None' 的部分内容是非常令人讨厌的。您能否将其作为“答案”输入,我可以接受。我使用的是 2.7.x,但是提到 python3 的 lru_cache 看起来像是我应该知道的,你能提供参考吗?

标签: python decorator introspection


【解决方案1】:

您可以向部分添加一个 _wrapped 属性,这可能是您已经做过的:

def __get__(self, obj, objtype):
    """Support instance methods."""
    f = functools.partial(self.__call__, obj)
    f._wrapped = self.func
    return f

或者,如果 obj 为 None(即,如果它是从类而不是实例访问的),您可以返回 self.func 而不是部分:

def __get__(self, obj, objtype):
    """Support instance methods."""
    if obj is None:
        return self.func
    else:
        return functools.partial(self.__call__, obj) 

部分的func 属性是记忆对象的__call__ 方法。如果您从 Foo 实例调用它,则第一个参数通过部分设置为实例 obj(参见 Foo().foo.args 中的 this)。然后在memoized.__call__ 中,self.func(*args) 就像穷人的绑定方法一样工作。

对于 lru_cache,Raymond Hettinger 提供了与 Python 2 兼容的实现,地址为 ActiveState Code Recipes。除了最近最少使用之外,还有一个最不常用的版本。

【讨论】:

  • 第二个代码示例看起来特别优雅,谢谢! (lru_cache 也适用 - 可惜我不能接受这两次......)
猜你喜欢
  • 2012-05-24
  • 1970-01-01
  • 2010-09-17
  • 2012-02-03
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多