передача словаря ограничений по шаблону из файла конфигурации - PullRequest
2 голосов
/ 25 марта 2020

Я строю трубопровод из змеиной воды. У меня есть файл config.yaml, в котором я хочу сохранить ограничения по шаблону. Скажем, у меня есть этот блок в файле конфигурации:

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

Тогда в моем snakefile у меня есть:

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 получает мой словарь wildcard_constraints из config.yaml. Но вместо того, чтобы просто использовать его в качестве словаря ограничений подстановочных знаков, он пытается его проанализировать.

Как мне обойти это?

Если я просто включу следующее в файл змеи вместо попытки чтобы получить ограничения из config.yaml, ошибки нет. Так что этого было бы достаточно, но было бы неплохо иметь возможность выделить ограничения.

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

1 Ответ

1 голос
/ 26 марта 2020

Вы можете сделать это динамически, изменив диктовку 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. По крайней мере, имейте в виду, что у вас нет гарантии, что это будет стабильно во всех версиях.

...