Python 调试器未能识别定义的变量

Python Debugger Fails to Recognize a Defined Variable

我正在尝试使用 Python 的调试模块 pdb 查看列表理解调用的结果。然而,pdb“环境”同时声明变量已定义和未定义,导致 pdb 同意已定义的变量的 NameError。以下是复制问题的最小代码示例:

import pdb
        
def main():
    bar = [0, 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, 0, 1, 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 中发现了一个错误! pdbprint 命令不是 full-blown 交互式解释器,并且很难找到凭直觉 应该 容易找到的变量,但不是t 因为底层的 CPython 实现。特别是,它在闭包和列表推导式中经常做不到这一点。 Here's a bug report.

错误报告确实提到了解决方法。输入 interact,您将获得一个完整的交互式 python shell,您应该能够在其中评估您的列表理解:

-> print([False if bar[i] == 0 else True for i in range(len(bar))])
(Pdb) p [False if bar[i] == 0 else True for i in range(len(bar))]
*** NameError: name 'bar' is not defined
(Pdb) interact
*interactive*
>>> [False if bar[i] == 0 else True for i in range(len(bar))]
[False, False, True, True]
>>>