Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List comprehension scope error from Python debugger

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?

like image 755
gerrit Avatar asked Jun 10 '14 19:06

gerrit


1 Answers

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] >>>  
like image 192
Antimony Avatar answered Oct 02 '22 09:10

Antimony