'NameError: global name is not defined' under pdb, for dictionary that does exist
You set a new local with pdb
, but that is not visible to expressions using nested scopes in this debugger session. Any expression in a nested scope such as the lambda
used for the key
argument, using a name that is local to the current frame, would need to be a closure and will have this problem.
That's a limitation of how the debugger and Python compilation work; closures can only be created if the function that need to produce them was compiled in the same session. Since the function you are debugging was compiled without foo
being a closure, it cannot be used by the lambda
expression as such.
You can bind the local to the lambda (making it a local rather than a closure):
max(foo, key=lambda x, foo=foo: foo[x]['extra_data']['budget'])
See What exactly is contained within a obj.__closure__? for details on how the Python compiler creates closures.
There is a bug report for Python 3 (however this issue affects Python 2.7 as well as you found out) which suggests a workaround as an alternative to Martijn's solution: interact
at the pdb
prompt drops you into an interactive session which is populated with globals()
and locals()
and your lambda
should work as expected.
This is gonna mess with your global scope but it's a quick (dirty) workaround I use in this case when using python 2.7:
globals().update(locals())