python – 为什么我在这个生成器中得到一个KeyError?

python – 为什么我在这个生成器中得到一个KeyError?,第1张

概述我有以下字典: d = { 'A': { 'param': { '1': { 'req': True, }, '2': { 'req': True, }, }, }, 'B': { 我有以下字典:

d = {    'A': {        'param': {            '1': {                'req': True,},'2': {                'req': True,'B': {        'param': {            '3': {                'req': True,'4': {                'req': False,}

我想要一个生成器,它将为我提供每个第一级键,所需的参数.

req = {}for key in d:    req[key] = (p for p in d[key]['param'] if d[key]['param'][p].get('req',False))

所以在这里,对于d中的每个键,只有当req为True时才得到参数p.

但是,当我尝试使用我的生成器时,它会引发KeyError异常:

>>> req{'A': <generator object <genexpr> at 0x27b8960>,'B': <generator object <genexpr> at 0x27b8910>}>>> for elem in req['A']:...     print elem---------------------------------------------------------------------------KeyError                                  Traceback (most recent call last)<ipython-input-6-a96226f95cce> in <module>()----> 1 for elem in req['A']:      2     print elem      3 <ipython-input-4-1732088ccbdb> in <genexpr>((p,))      1 for key in d:----> 2         req[key] = (p for p in d[key]['param'] if d[key]['param'][p].get('req',False))      3 KeyError: '1'
解决方法 您分配给req [key]的生成器表达式绑定在键变量上.但循环中从’A’到’B’的关键变化.迭代第一个生成器表达式时,它会在if条件下计算“B”键,即使在创建时键为“A”.

绑定到变量值而不是其引用的传统方法是将表达式用默认值包装在lambda中,然后立即调用它.

for key in d:    req[key] = (lambda key=key: (p for p in d[key]['param'] if d[key]['param'][p].get('req',False)))()

结果:

12
总结

以上是内存溢出为你收集整理的python – 为什么我在这个生成器中得到一个KeyError?全部内容,希望文章能够帮你解决python – 为什么我在这个生成器中得到一个KeyError?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1193045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存