如何在Python中模拟函数以更改默认关键字参数

2024-09-29 01:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用模拟库和unittest2来测试我的软件项目的不同方面。在

目前我有一个问题:是否可以模拟一个函数,使默认关键字参数不同,但功能仍然存在?在

假设我有以下代码

class C():
  def fun(self, bool_arg = True):
    if bool_arg:
      return True
    else
      return False

如果我想嘲笑C.fun怎么办:

^{pr2}$

因此,每个C实例都将关键字“bool_arg”替换为False,而不是True和以下结果:

c = C()
c.fun()

退货:

False


Tags: 项目函数代码功能falsetrue参数return
2条回答

您也可以尝试包装您的函数。有东西在网上

def wrapper(func, bool_arg):
    def inner(*args, **kwargs):
        kwargs['bool_arg']=bool_arg
        return func(*args, **kwargs)
    return inner

以及

^{pr2}$

应该行得通

编辑

如果要更改类的默认值而不是特定实例的默认值,可以创建一个派生类并重新定义fun包装C的方法。线上有东西(我现在没有时间测试):

class D(C):
    def fun(self, *args, **kwargs):
        f = wrapper(C.f, False)
        return f(*args, **kwargs)

然后关于@Ber的建议,您可以定义def wrapper(func, **wrapkwargs),然后代替{}do

for i in wrapkwargs.iteritems():  #wrapkwargs is a dictionary
    kwargs[i[0]] = i[1]

您可以尝试使用以下代码:

>>> import mock
>>> 
>>> class C():
...   def fun(self, bool_arg = True):
...     if bool_arg:
...       print "True"
...     else:
...       print "False"
... 
>>> c = C()
>>> funCopy = c.fun
>>> c.fun = mock.Mock(side_effect=lambda bool_arg=False: funCopy(bool_arg=bool_arg))
>>> c.fun()
False

希望这有帮助

相关问题 更多 >