You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake导入规则时如何使用参数默认值?

问题

尝试通用化Snakemake工作流时遇到异常。创建了analysis.smk文件编写通用规则以便多工作流导入使用,规则内容如下:

rule analysis:
   output: test.root
   input:   input_test.root
   params:
      variable: "SvB"
      rebin:  10
   shell:  `python run_analysis.py {params.variable} {params.rebin}`

在另一个Snakefile中导入该规则并使用:

module analysis:
   snakefile: "analysis.smk"
   config: config

use rule analysis from analysis as run_analysis with:
   output: f"{config['output']}/hist.root"
   input: f"{config['output']}/input_hist.root"
   params:
      rebin: 20

运行时出现错误:

AttributeError: 'Params' object has no attribute 'variable', when formatting the following:

原因是未定义variable参数。只想修改部分参数值,其余使用默认值,这是预期行为吗?使用的是Snakemake 8.27.1版本。

解决方案

这不是预期行为,而是Snakemake模块规则重载的特性:当在with块中指定params时,会完全覆盖原规则的params,而非合并。要实现只修改部分参数、保留默认值的需求,有两种可行方法:

方法1:显式继承原参数

在重载规则时,直接引用原模块规则的默认参数值,示例如下:

use rule analysis from analysis as run_analysis with:
   output: f"{config['output']}/hist.root"
   input: f"{config['output']}/input_hist.root"
   params:
      variable: analysis.params.variable
      rebin: 20

方法2:将默认参数移至配置文件

把通用规则的默认参数绑定到配置项,通过config.get()设置默认值,这样重载时未指定的参数会自动使用配置默认值。

修改analysis.smk:

rule analysis:
   output: test.root
   input:   input_test.root
   params:
      variable: config.get("variable", "SvB")
      rebin:  config.get("rebin", 10)
   shell:  `python run_analysis.py {params.variable} {params.rebin}`

导入时只需指定需要修改的参数:

use rule analysis from analysis as run_analysis with:
   output: f"{config['output']}/hist.root"
   input: f"{config['output']}/input_hist.root"
   params:
      rebin: 20

此时variable会自动使用默认值"SvB"。

内容的提问来源于stack exchange,提问作者Alejandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:25:01