0

如何解決這個問題?使用另一個簽名修補一個對象方法(例如,一個額外的參數)我嘗試綁定可選參數,但這似乎不起作用,我不能在這裏使用普通的猴子修補,因爲修補過的類在下面調用一個位置,我無法以其他方式打補丁這種方式Python mock.patch.object與functool.partial綁定參數可能嗎?

任何幫助表示讚賞

import mock 
import functools 

# this class lives in another (unchangeable) module, __len__ method has to be patched 
class ToOverride(object): 
    def __len__(self): 
     raise NotImplementedError() 

# this code is changeable 
def my_len(self, arg): 
    return arg+1 

my_len_bound = functools.partial(my_len, arg=1) 

with mock.patch.object(ToOverride, '__len__', my_len_bound): 
    inst = ToOverride() 
    print len(inst) # expected output: 2 

當調用上下文mock.patch.object,我得到以下錯誤:。

TypeError         Traceback (most recent call last) 
<ipython-input-7-bfdb41d8628f> in <module>() 
     1 with mock.patch.object(ToOverride, '__len__', my_len_bound): 
     2  inst = ToOverride() 
----> 3  print len(inst) 

TypeError: my_len() takes exactly 2 arguments (1 given) 

但是調用my_len作爲第一個參數作爲EXP (打印出2)。

假設它可能只是猴子補丁,它可以工作,如果len被手動調用,實例作爲第一個參數。但是,這當然是不希望的:

ToOverride.__len__ = my_len_bound 
inst = ToOverride() 
print(inst.__len__(inst)) # 2 

回答

1

通過採用封閉模式,一個能避免使用functools部分,不用於類方法的工作。

def bind_arg(arg): 
    def my_len(self, arg): 
     return arg+1 
    return my_len