debugging Python调试器中的列表解析范围错误

zpf6vheq  于 2022-11-14  发布在  Python
关注(0)|答案(3)|浏览(114)

在调试我的代码时,我想使用列表解析。但是,当我在函数内部时,似乎无法从调试器中计算列表解析。
我使用的是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,还是调试器的某种基本限制?

2wnc66cl

2wnc66cl1#

在Python 3中,由于解析实现方式的改变,在访问任何非全局变量之前,必须在pdb中使用interact命令。

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

1qczuiv02#

pdb似乎正在使用以下代码运行代码:

eval(compiled_code, globals(), locals())

(or甚至可能只是eval(string, globals(), locals()))。
不幸的是,在编译时Python并不知道局部变量,这在正常情况下并不重要:
第一次
但是当引入另一个作用域时,比如使用列表解析lambda,编译效果会很差:
第一个
请注意,这是一个LOAD_GLOBAL,其中x在本地范围内。
这里有一个完全愚蠢的黑客绕过它:

(Pdb) eval("(lambda: x)()", vars())
[1, 2, 3, 3, 4]
nbnkbykc

nbnkbykc3#

在调试器中运行依赖于外部上下文的列表解析

接受的解决方案对我不起作用。或者,也许我的设置不同,我无法区分问题的设置。但是,当我搜索一个解决方案来运行依赖于解析范围之外的对象的列表解析时,这就是google引导我的地方。所以,这里有一个解决方案给其他有同样问题的人。在调试器中运行下面的代码行。

globals().update(locals())

然后,您的列表解析应该可以正常运行。Source.

相关问题