我正在尝试使用 Python 的调试模块 pdb 查看列表理解调用的结果。然而,pdb“环境”同时声明变量已定义和未定义,从而导致NameErrorpdb 同意定义的变量。以下是复制该问题的最小代码示例:
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()
Run Code Online (Sandbox Code Playgroud)
在上面指示的代码执行点运行以下 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]
Run Code Online (Sandbox Code Playgroud)
此外,在没有 pdb 模块的情况下运行代码会产生预期的结果。pdb.set_trace()更改函数的方法调用位置main对结果没有影响。我需要做什么才能调试此列表理解调用?
您偶然发现了一个错误pdb!pdb的print命令不是一个成熟的交互式解释器,并且可能很难找到直观上应该很容易找到的变量,但由于底层的 CPython 实现而并非如此。特别是,它在闭包和列表推导式中经常无法做到这一点。这是错误报告。
不过,错误报告确实提到了解决方法。输入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]
>>>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |