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



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

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

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

configfile: 'config/config.yaml'
print(config['wildcard_constraints']) # for debugging
wildcard_constraints: config['wildcard_constraints']
rule test:
output:
touch("{sample}.test")

这会产生以下内容:

{'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中获得了我的通配符约束字典。但它并没有将其用作通配符约束字典,而是尝试对其进行解析。

我该怎么绕过这个?

如果我只是在snake文件中包含以下内容,而不是试图从config.yaml中获取约束,那么就没有错误。因此,这就足够了,但如果能够分离出约束条件,那就太好了。

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

您可以通过修改workflow._wildcard_constraintsdict来动态执行此操作。例如,以下操作(在Snakemake5.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上工作。至少,请注意,您不能保证它在各个版本中都是稳定的。

最新更新