gpt4 book ai didi

python - 如何在 pdb 中调试手动键入的表达式和语句?

转载 作者:太空狗 更新时间:2023-10-29 23:58:11 25 4
gpt4 key购买 nike

在 pdb(或 ipdb)中,我们可以使用 ! or p commands 执行语句和计算表达式:

p expression
     Evaluate the expression in the current context and print its value.

[!]statement

     Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To set a global variable, you can prefix the assignment command with a global command on the same line

因此,例如,我可以在 ipdb 中调试时键入 p reddit.get_subreddits(),代码将在当前上下文中执行,我将看到返回值。

有没有办法调试这种“手动输入”表达式的执行?

基本上我想做的是 s reddit.get_subreddits(),但这只是执行 step 命令并忽略表达式。

编辑:一个简单的例子

采用这个简单的函数:

import random

def get_value_for_weekday(weekday_index=None):
values = [10, 20, 20, 10, 30, 30, 30]
if not weekday_index:
# If no weekday provided, return the average of all weekdays
return sum(values) / 7
return averages[weekday_index]

if __name__ == '__main__':
while True:
import ipdb; ipdb.set_trace() # enter ipbd for debug
get_value_for_weekday(random.randint(0, 7))

因为 if not weekday_index 而被窃听(它应该检查 weekday_index is not None。)

假设我注意到我得到 10 的次数是我预期的一半。所以我添加了一个 import ipdb; ipdb.set_trace() 在调用函数之前尝试调试代码。

所以我在 ipdb 控制台中,我突然想到问题可能出在我将 0 作为 weekday_index 传递时。我可以直接在 ipdb 中测试我的假设:

ipdb> p get_value_for_weekday(0)
22

好的,所以当 weekday_index=0 时我意识到有问题。
我现在想做的是逐步调试对 get_value_for_weekday(0) 的调用,这样我就可以看到我错误地进入了 if block 。

显然我可以退出 ipdb,停止脚本,将代码更改为始终传递 0,重新启动脚本,当我进入 ipdb 时,使用 ipdb step (s) 命令。
但是,如果我可以像执行 p get_value_for_weekday(0) 一样执行 s get_value_for_weekday(0) 不是更容易吗?

有没有办法做这样的事情?

最佳答案

我认为您正在寻找 (d)ebug 命令,出于某种原因,Debugger Commands 中未指定该命令.仅供将来引用,pdb 指定了一组很好的命令(您可以通过在交互式提示中键入 help 来查看)。在 debug 命令上:

(Pdb) help debug
debug code
Enter a recursive debugger that steps through the code
argument (which is an arbitrary expression or statement to be
executed in the current environment).

这似乎可以满足您的需求。从终端使用您的示例脚本:

python -m pdb pdbscript.py

在发出两个 n 命令以便解析函数之后(我相信这就是 pdb 的工作方式)。您可以发出 debug get_value_for_weekday(0) 命令以递归步进函数:

(Pdb) debug get_value_for_weekday(0)
ENTERING RECURSIVE DEBUGGER
> <string>(1)<module>()
((Pdb)) s
--Call--
> /home/jim/Desktop/pdbscript.py(3)get_value_for_weekday()
-> def get_value_for_weekday(weekday_index=None):
((Pdb)) n
> /home/jim/Desktop/pdbscript.py(4)get_value_for_weekday()
-> values = [10, 20, 20, 10, 30, 30, 30]
((Pdb)) n
> /home/jim/Desktop/pdbscript.py(5)get_value_for_weekday()
-> if not weekday_index:
((Pdb)) p weekday_index
0
((Pdb)) n
> /home/jim/Desktop/pdbscript.py(7)get_value_for_weekday()
-> return sum(values) / 7

请注意,我对这种形式的元调试非常粗略,但这似乎正是您所追求的。

关于python - 如何在 pdb 中调试手动键入的表达式和语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34769636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com