当变量名与PDB命令冲突时,我该如何操作变量?

129

我的代码中充满了单字母变量(因为它是物理学方面的内容,这些字母具有特殊意义),以及我经常与 NumPy 交互的变量。

在使用 Python 调试器时,有时我想查看某个变量(比如 n)的值。然而,当我按下 n<enter> 键时,它会执行 PDB 的 (n)ext 命令,优先级更高。使用 print n 可以解决这个问题,但我该如何设置这个变量呢?


3
有点过度了,但你试过用 eval 吗?eval('n = 3')?也许会有帮助 :) - Paulo Bu
5个回答

178

在语句前使用感叹号!,可以使其运行:

python -m pdb test.py
> /home/user/test.py(1)<module>()
-> print('foo')
(Pdb) !n = 77
(Pdb) !n
77
(Pdb) n
foo
> /home/user/test.py(2)<module>()
-> print('bar')
(Pdb)

根据文档

! 语句

在当前堆栈帧的上下文中执行(一行)语句。感叹号可以省略,除非语句的第一个单词类似于调试器命令。[...]


6
在我看来,对于命令需要加上!或类似的前缀会更加用户友好。 - user76284

13

你可以使用分号,在其前面加上其他内容:

ipdb> print n
2
ipdb> n
> 145 <some code here>
  146
  147

ipdb> 1; n=4
1
ipdb> print n
4

8
这是一个实用的解决方法,但我相信“!”符号是用来处理这种情况的操作符。 - dinosaur

3

使用方括号(variable_name)

例如,如果您有一个名为q的变量,并且想要查看它的值。 如果您直接在提示符中输入q,那么ipdb调试过程将退出并中断。

>>> q

相反,您应该输入(q)来检查此变量:

>>> (q)

然后它的值将会被打印出来。


2
那并不是你问题的直接答案,但或许可以帮到你:PuDB是一个基于控制台的PDB可视化界面,它的设计将命令和变量操作分开。你可以点击这个链接了解更多信息:PuDB

看起来很有趣;我得在有时间学习的时候试一试。 - Nick T

0

Eric IDE、Wing IDE 和 Spyder 只是其中几个具有可视化调试器的编程工具,值得一试,因为它们将值的显示与命令分开。


1
与通过控制台调试相比,可视化调试器通常非常缓慢,启动调试器几乎不需要时间。 - IssamLaradji
1
@Curious 它们启动较慢,但对于那些经验有限的人来说通常更易用。 - Steve Barnes
对于科学工作,我发现Spyder的调试器很方便。我认为在CLI上调试一个10x10矩阵是不切实际的。 - shaunakde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接