【问题标题】:Python Debugger Fails to Recognize a Defined VariablePython 调试器无法识别已定义的变量
【发布时间】:2020-08-19 20:23:39
【问题描述】:

我正在尝试使用 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 还是能够在列表理解中进行调试?
  • 目标是能够在列表理解中进行调试。
  • 使用 debugpy 或 pdb 的 VSCode 将为您处理这些情况。我怀疑您在这里遇到了关闭问题——目前大多数 IDE 都会解决这个问题。这对您来说是一个可行的解决方案吗?

标签: python pdb ipdb


【解决方案1】:

您偶然发现了pdb 中的一个错误! pdbprint 命令不是一个成熟的交互式解释器,并且很难找到直观地应该容易找到但不是因为底层 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]
>>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2012-09-21
    • 2022-09-24
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多