列出来自Python调试器的理解范围错误

问题描述

在Python 3中,interact由于实现理解的方式发生了变化,因此必须先在pdb中使用命令才能访问任何非全局变量

>>> 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]
>>>

解决方法

在调试代码时,我想使用列表推导。但是,当我在函数内部时,似乎无法从调试器评估列表理解。

我正在使用Python 3.4。

脚本内容

$ cat test.py 
#!/usr/bin/python

def foo():
    x = [1,2,3,4]

    print(x)

foo()

交互式调试:

$ 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,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,4]

为什么x列表理解未知?如何评估调试器的列表理解能力,或实现等效的行为?这是一个错误,还是对调试器的某种基本限制?