'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())