我知道我可以使用 PDB 来跟踪一个模块,并且我可以通过在它前面加上一个 ! 从 pdb 执行任意命令。(例如!"foo".upper()
)。
有没有办法结合这些功能来跟踪在当前上下文中执行的任意命令?例如,这样的事情step !"foo".upper()"
会让我单步执行该upper
方法,然后返回到之前的上下文?
采用pdb.runcall
(Pdb) pdb.runcall(func, *args, **kwds) # e.g. pdb.runcall(myfunc, arg1, arg2)
并通过 (n 或 s) 单步执行或在其中设置断点
(Pdb) b my_module.py:123 # b ([file:]lineno | function) [, condition]
并按“c”运行到断点。
您无法跟踪示例中使用的 str.upper 等内置函数。
编辑:您还询问了当前上下文:
您可以在当前上下文中使用用户定义的函数评估和调试表达式。例子:
pdb.runeval("[myfunc(x) for x in range(3)]", globals(), locals())
# or with ... some_module.globals())
参数globals(), locals()
很重要,因为没有它们,表达式将在__main__
模块上下文中计算,或者如果不使用 locals() 则直接在当前模块上下文中计算,但不会在当前全局和本地上下文中进行计算,就像通常使用!expression
.