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

Snakemake规则input中根据布尔值选输入的正确实现方法

报错原因

该语法错误由Python原生语法限制导致,并非Snakemake的特殊规则:在关键字参数的赋值位置,Python不支持直接嵌套多行if/else语句块,因此直接在input块内写分支的写法会触发解析报错。

简洁实现方案

不需要拆分两个独立规则,以下两种写法都可以在单个quantify规则内实现需求:

方案1:单行三元表达式赋值(适配简单判断场景,最简洁)

直接在input的字段赋值时使用Python单行三元表达式做判断,完全符合语法要求,{sample}通配符会被Snakemake正常解析,和你原本的路径逻辑完全一致:

rule quantify:
    input:
        forward = path_trimmed_fastq + "/{sample}_R1_val_1.fq.gz" if trimmed_fastq else fastq_path + "/{sample}_R1.fastq.gz",
        rev = path_trimmed_fastq + "/{sample}_R2_val_2.fq.gz" if trimmed_fastq else fastq_path + "/{sample}_R2.fastq.gz"
    # 后续output、params、shell等逻辑块正常编写即可

方案2:抽离输入生成函数(适配复杂逻辑场景,易维护)

如果后续判断逻辑会扩展(比如不同样本对应不同修剪策略、需要提前校验文件存在性),可以把路径生成逻辑抽为独立辅助函数,通过unpack映射到input字段,可维护性更强:

def get_quantify_input(wildcards):
    if trimmed_fastq:
        fwd_path = f"{path_trimmed_fastq}/{wildcards.sample}_R1_val_1.fq.gz"
        rev_path = f"{path_trimmed_fastq}/{wildcards.sample}_R2_val_2.fq.gz"
    else:
        fwd_path = f"{fastq_path}/{wildcards.sample}_R1.fastq.gz"
        rev_path = f"{fastq_path}/{wildcards.sample}_R2.fastq.gz"
    return {"forward": fwd_path, "rev": rev_path}

rule quantify:
    input:
        unpack(get_quantify_input)
    # 后续逻辑块正常编写

补充说明:如果trimmed_fastq不是全局固定布尔值,而是随样本变化的配置,只需要在辅助函数内结合wildcards.sample读取对应样本的配置项做判断即可,不需要调整规则主体结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:00:51