带KeyError的InputFunctionException

时间:2018-02-09 16:08:18

标签: snakemake

假设我在python中有一个代码生成一个字典作为结果。我需要在单独的文件夹中编写字典的每个元素,稍后将由snakemake中的其他规则集使用。 我已经编写了如下代码,但它不起作用!

simulation_index_dict={1:'test1',2:'test2'}


def indexer(wildcards):
    return(simulation_index_dict[wildcards.simulation_index])

rule SimulateAll:
       input:
        expand("{simulation_index}/ProteinCodingGene/alfsim.drw",simulation_index=simulation_index_dict.keys())



rule simulate_phylogeny:
    output:
        ProteinCodingGeneParams=expand("{{simulation_index}}/ProteinCodingGene/alfsim.drw"),
        IntergenicRegionParams=expand("{{simulation_index}}/IntergenicRegions/dawg_IR.dawg"),
        RNAGeneParams=expand("{{simulation_index}}/IntergenicRegions/dawg_RG.dawg"),
        RepeatRegionParams=expand("{{simulation_index}}/IntergenicRegions/dawg_RR.dawg"),
    params:
        value= indexer,
    shell:
        """
        echo {params.value} > {output.ProteinCodingGeneParams}
        echo {params.value} > {output.IntergenicRegionParams}
        echo {params.value} > {output.RNAGeneParams}
        echo {params.value} > {output.RepeatRegionParams}
        """

它返回的错误是:

InputFunctionException in line 14 of /$/test.snake:
KeyError: '1'
Wildcards:
simulation_index=1

似乎问题在于规则的params部分,因为删除它会消除错误,但我无法弄清楚params有什么问题!

1 个答案:

答案 0 :(得分:1)

解决方案:使用字符串作为字典键

可以从错误消息(KeyError: '1')中猜测字典中的某些查询在'1'的密钥上出错,这恰好是一个字符串。

然而,indexer" params"中使用的词典函数有整数作为键。

显然,使用字符串而不是整数作为此simulation_index_dict字典的键可解决问题(请参阅问题下方的评论)。

原因:工作流程推断期间丢失类型信息

问题的原因可能是分配给simulation_index_dict.keys()simulation_index的{​​{1}}参数的值的整数性质(继承自expand)是& #34;遗忘"在工作流推理的后续步骤中。

实际上,SimulateAll会产生一个字符串列表,然后将其与其他规则(也包含字符串)的输出进行匹配,以推断expand属性的值(这也是字符串)。因此,执行wildcards函数时,indexer是一个字符串,这会在wildcards.simulation_index中查找时导致KeyError。