使用python decorator来装饰函数

时间:2015-05-15 02:32:32

标签: python mocking decorator

我正在尝试模拟我们的git包装器,以便我们可以测试它。我计划使用mockproc python库,它提供了使用提供的脚本模拟任何进程名称的功能。它的工作原理是这样的 -

self.scripts.append( 'process-name', returncode=0, stdout="output to process" )
with self.scripts:
        run_and_handle_result()

我需要在这上面添加一个装饰层,以便我可以做一些额外的事情,比如句柄重试。我想要的是这样的东西 -

@mockproc('git') # tells that we are mocking git
def test_something(mock_proc):
    mock_proc.set_script("sleep (60)")
    # Run some git command
    mockproc.check_exit_signal()

问题是我希望装饰师处理with self.scripts部分。所以我想要的是装饰器运行该函数,将进程名称设置为git,这很简单。然后运行test函数,该函数添加脚本并在git命令周围添加with self.script,然后恢复该函数。

反正有吗?是装饰者实施它的坏方法吗?这不是化妆品要求。我需要这个,因为在我的一些命令中有重试逻辑,我需要为mockproc提供多个脚本并多次运行。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您想要覆盖函数的命名自由变量。您可以使用fun.func_globals[some_name] = some_value。 E.g。

def x(a):
    pow2(a)

 x.func_globals['pow2'] = lambda y: y*y

 x(3) == 9