问题描述
我正在尝试使用Python的调试模块pdb查看列表理解调用的结果。但是,pdb“环境”同时声称已定义了一个变量,并且未定义该变量,从而导致pdb同意定义的变量的NameError
。以下是重复此问题的最小代码示例:
import pdb
def main():
bar = [0,1,1]
foo(bar)
def foo(bar):
pdb.set_trace()
### pdb COMMANDS LISTED BELOW ARE CALLED HERE ###
print([False if bar[i] == 0 else True for i in range(len(bar))])
main()
在上述代码执行点运行以下pdb命令会导致以下结果。
(Pdb) p bar
[0,1]
(Pdb) p [False if bar[i] == 0 else True for i in range(len(bar))]
*** NameError: name 'bar' is not defined
(Pdb) !print([False if bar[i] == 0 else True for i in range(len(bar))])
*** NameError: name 'bar' is not defined
(Pdb) n
[False,False,True,True]
此外,在没有pdb模块的情况下运行代码会产生预期的结果。将pdb.set_trace()
方法调用的位置更改为main
函数对结果没有影响。我需要做什么才能调试此列表理解调用?
解决方法
您偶然发现了pdb
中的错误! pdb
的{{1}}命令不是一个功能全面的交互式解释器,可能难以找到直观上应该容易找到但并非出于底层原因的变量CPython实现。特别是,它经常无法在闭包和列表理解中做到这一点。 Here's a bug report。
该错误报告确实提到了一种解决方法。输入print
,您将获得一个完整的交互式python shell,您应该可以在其中评估列表理解:
interact