代码之家  ›  专栏  ›  技术社区  ›  Masih

InputFunctionException with KeyError

  •  1
  • Masih  · 技术社区  · 7 年前

    假设我有一个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 回复  |  直到 7 年前
        1
  •  1
  •   bli    7 年前

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

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

    然而,在 indexer “params”函数将整数作为键。

    显然,使用字符串而不是int作为键 simulation_index_dict 字典解决了这个问题(参见问题下面的注释)。

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

    问题的原因可能是整数性质(继承自 simulation_index_dict.keys() )分配给的值的 simulation_index 的参数 expand 在里面 SimulateAll 在工作流推理的后续步骤中被“遗忘”。

    事实上 扩大 结果生成一个字符串列表,然后与其他规则(也包含在字符串中)的输出进行匹配,以推断 wildcards 属性(也是字符串)。因此,当 索引器 函数被执行, wildcards.simulation_index 是一个字符串,在中查找时会导致KeyError 模拟\u索引\u目录 .