In debugging my code, I want to use a list comprehension. However, it seems I cannot evaluate a list comprehension from the debugger when I'm inside a function.
I am using Python 3.4.
Script contents:
$ cat test.py
#!/usr/bin/python
def foo():
x = [1, 2, 3, 3, 4]
print(x)
foo()
Interactive debugging:
$ python3 -mpdb test.py
> /tmp/test.py(3)<module>()
-> def foo():
(Pdb) step
> /tmp/test.py(8)<module>()
-> foo()
(Pdb)
--Call--
> /tmp/test.py(3)foo()
-> def foo():
(Pdb)
> /tmp/test.py(4)foo()
-> x = [1, 2, 3, 3, 4]
(Pdb)
> /tmp/test.py(6)foo()
-> print(x)
(Pdb) p [x for _ in range(1)]
*** NameError: name 'x' is not defined
(Pdb) p x
[1, 2, 3, 3, 4]
Why is x
unknown to the list comprehension? How could I evaluate a list comprehension from the debugger, or achieve an equivalent behaviour? Is this a bug, or is it some sort of fundamental limitation to the debugger?
In Python 3, you have to use the
interact
command in pdb before you can access any non-global variables due to a change in the way comprehensions are implemented.pdb
seems to be running the code with:(or maybe even just
eval(string, globals(), locals())
).Unfortunately, on compilation Python doesn't know of the local variables. This doesn't matter normally:
but when another scope is introduced, such as with a list comprehension of
lambda
, this compiles badly:Note how that's a
LOAD_GLOBAL
wherex
is in the local scope.Here's a totally stupid hack to get around it: