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
相关产品推荐
相关产品推荐

