从配置文件传递通配符约束的字典

问题描述 投票:2回答:1

我正在构建一个蛇形管道。我有一个config.yaml文件,我想在其中存储通配符约束。说我在配置文件中有这个块:

wildcard_constraints:
    sample: '[^_/]+'
    reference: '[^/]+'

然后在我的蛇文件中,我有:

configfile: 'config/config.yaml'

print(config['wildcard_constraints']) # for debugging

wildcard_constraints: config['wildcard_constraints']

这将产生以下内容:

{'sample': '[^_/]+', 'reference': '[^/]+'}
TypeError in line 32 of /myfolder/snakefile:
global_wildcard_constraints() takes 1 positional argument but 2 were given
  File "/myfolder/snakefile", line 32, in <module>

因此,snakemake从config.yaml中获取我的wildcard_constraints字典就很好了。但是,它不仅试图将其用作通配符约束字典,还试图对其进行解析。

我该如何解决?

如果仅在蛇文件中包含以下内容,而不是尝试从config.yaml获取约束,则不会出现错误。这样就足够了,但是能够分离出约束是很好的。

wildcard_constraints:
    sample = '[^_/]+',
    reference = '[^/]+'
snakemake
1个回答
0
投票

您可以通过修改workflow._wildcard_constraints字典来动态地执行此操作。例如,以下作品(在Snakemake 5.11.2上):

configfile: "config.yaml"

for wildcard, constraint in config["wildcard_constraints"].items():
    workflow._wildcard_constraints[wildcard] = constraint

print(workflow._wildcard_constraints) # For debugging

rule test:
    output:
        touch("{sample}.test")

并打印{'reference': '[^/]+', 'sample': '[^_/]+'}。我还确认了规则test可以创建例如example.test,但不是_example.test

但是,由于它可以在“专用” _wildcard_constraints上运行,因此可能有点hack。至少要知道,您不能保证在各个版本中这都是稳定的。

© www.soinside.com 2019 - 2024. All rights reserved.