4

我知道我可以使用 PDB 来跟踪一个模块,并且我可以通过在它前面加上一个 ! 从 pdb 执行任意命令。(例如!"foo".upper())。

有没有办法结合这些功能来跟踪在当前上下文中执行的任意命令?例如,这样的事情step !"foo".upper()"会让我单步执行该upper方法,然后返回到之前的上下文?

4

1 回答 1

3

采用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.

于 2013-01-12T20:02:08.130 回答