2011-09-22 62 views
1

通常我會使用inspect.getargspec,但是如何獲得已綁定方法的參數?如何獲取任何python方法的參數?

例如,如何獲取的方法 '富' 的說法名稱如下:

class Foo(object): 

    @memoized 
    def foo(self, arg1, arg2): 
     pass 

注意,美孚()foo是一個memoized對象,http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

這意味着,真的是一個functools.partial實例。

如何獲取原始函數或以某種方式獲取參數?

如果我不能,這是否表明PythonDecoratorLibrary的設計缺陷?

+0

我已經通過有效編寫我自己的Memoize替換,使我能夠獲得原始功能,但是這個問題依然存在。 – Arafangion

+0

eryksun:雖然看起來很奇怪,但它已經有了一個.func(它似乎是一個curried函數?),但是它的返回self.func而不是partial,如果obj是None,我確實爲該partial添加了_wrapped屬性'非常侵入。你可以把它作爲'答案',我可以接受它。我使用的是2.7.x,但是提到python3的lru_cache看起來應該是我應該注意的,你能提供一個參考嗎? – Arafangion

回答

2

你可以一個_wrapped屬性添加到局部,這可能是你的所作所爲已經:

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

或者你可以返回部分的self.func代替如果obj是無(即,如果它是從訪問類,而不是一個實例):

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實例調用它,那麼第一個參數被部分設置爲實例obj(參見Foo()。foo.args)。然後在memoized.__call__中,self.func(* args)就像一個窮人的綁定方法。

對於lru_cache,Raymond Hettinger提供了Python 2兼容實現,可用的編號爲ActiveState Code Recipes。除最近最少使用的版本外,還有一個最不經常使用的版本。

+0

那第二個代碼例子看起來特別優雅,謝謝! (lru_cache是​​適用的,以及 - 可惜我不能接受這兩次...) – Arafangion

相關問題