在调试我的代码时,我想使用列表解析。但是,当我在函数内部时,似乎无法从调试器中计算列表解析。
我使用的是Python 3.4。
脚本内容:
$ cat test.py
#!/usr/bin/python
def foo():
x = [1, 2, 3, 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, 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]
为什么x
对于列表解析是未知的?我如何从调试器中评估列表解析,或者实现等效的行为?这是一个bug,还是调试器的某种基本限制?
3条答案
按热度按时间2wnc66cl1#
在Python 3中,由于解析实现方式的改变,在访问任何非全局变量之前,必须在pdb中使用
interact
命令。1qczuiv02#
pdb
似乎正在使用以下代码运行代码:(or甚至可能只是
eval(string, globals(), locals())
)。不幸的是,在编译时Python并不知道局部变量,这在正常情况下并不重要:
第一次
但是当引入另一个作用域时,比如使用列表解析
lambda
,编译效果会很差:第一个
请注意,这是一个
LOAD_GLOBAL
,其中x
在本地范围内。这里有一个完全愚蠢的黑客绕过它:
nbnkbykc3#
在调试器中运行依赖于外部上下文的列表解析
接受的解决方案对我不起作用。或者,也许我的设置不同,我无法区分问题的设置。但是,当我搜索一个解决方案来运行依赖于解析范围之外的对象的列表解析时,这就是google引导我的地方。所以,这里有一个解决方案给其他有同样问题的人。在调试器中运行下面的代码行。
然后,您的列表解析应该可以正常运行。Source.