假设我有一个Simulation
对象,其核心属性是参数字典,其形式如下:
@pytest.fixture
def param_base():
'''Dict of parameter defaults'''
return {
"fs" : 2e4,
"sweep_length" : 1,
"num_trials" : 300,
...
"pool_tau" : 1.00,
"quantal_size" : -10,
"a_tau" : (0.001,0.005)
}
我想编写一个pytest函数,它简单地运行这个模拟,其中每个参数都有一个值范围。一个结构稍有不同的字典可以概括这一思想:
^{pr2}$重要的是,我不想运行所有这些参数的所有组合,因为模拟的数量增长得太快了。I一次只想改变一个参数,而其他参数保持默认值。在
我目前的解决方案如下(在上述代码之后继续):
parameter_names = [
"cav_p_open",
"num_trials",
"num_stim",
"num_cav",
"cav_i",
"num_cav_ratio",
"vesicle_prox",
]
@pytest.mark.parametrize("p_name", parameter_names)
def test_runModel_range_params(p_name,param_ranges,param_base):
alt_params = copy.deepcopy(param_base)
p_range = param_ranges[p_name]
for i in range(len(p_range)):
alt_params[p_name] = p_range[i]
SIM = utils.Simulation(params = alt_params)
这很好用,但是因为我在每个参数范围内循环,所以我只能看到代码是否失败是因为utils.Simulation
在某个特定参数的某个值处失败,而不知道它具体在哪个参数上失败。在
所以我想我要找的是一个类似于pytest.mark.parameterize
的嵌套版本,在这里我可以对每个参数的每个范围值运行test_runModel_range_params
。在
有什么想法吗?优雅额外加分!在
我想你要找的是叠加参数化。从docs:
相关问题 更多 >
编程相关推荐