Why am I getting a KeyError in this generator?

I have the following dictionary:

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

I want to have a generator that will give me the necessary parameters for each first-level key.

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

So, for each key in d, I get the option ponly if req- True.

However, when I try to use a generator, it throws an exception 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'
+3
source share
2 answers

, req[key], key. key "A" "B" . , key 'B' if , key "A", .

, , , , .

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

:

1
2
+4

, key.

, for key in d: 'A', 'B', 1- key = 'A', - 'B' . '1'.

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

+3

All Articles