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.
>>> def foo(): [][0] ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in foo IndexError: list index out of range >>> import pdb;pdb.pm() > <stdin>(1)foo() (Pdb) x = 4 (Pdb) [x for _ in range(2)] *** NameError: name 'x' is not defined (Pdb) interact *interactive* >>> [x for _ in range(2)] [4, 4] >>>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With