如何使用 `pdb`、`inspect`、`pprint` 试验源代码?

How to experiment source code with `pdb`, `inspect`, `pprint`?

问题

  1. 我想了解Kur(深度学习库)的源码
  2. 我没有接受过适当的编程培训,我更喜欢在没有先验理论知识的情况下通过实验来学习
  3. 我想要一个简单的工具来帮助我深入研究源代码的详细工作原理
  4. 调试工具就像 pdb 库似乎是一个不错的选择
  5. 但是开始使用 pdb 试验源代码的最简单方法是什么?
  6. 我只想写一行代码来深入细节,而不是像许多示例中展示的那样写几行代码 google pdb

换句话说,我应该使用pdb的哪个功能?以及如何有效地将其用于实验源?

玩具示例

  1. 我想探索 kur dump mnist.yml
  2. 的内部运作
  3. 为了简单起见,我只想探索不超过 __main__.pykurfile.py
  4. 更具体地说,我想探索 __main__.py 中的 dump()parse_kurfile(),以及 kurfile.py
  5. 中的 Kurfile.__init__()
  6. 他们的关系如下:

    控制台:kur dump mnist.yml -->
    python: __main__.py : main() --> dump() --> parse_kurfile() -->
    python: kurfile.py : Kurfile class --> __init__() ...
    python:……剩下的就不去探究了

  7. 我应该使用 pdb 的哪个函数来探索从 dump()parse_kurfile() 再到 Kurfile.__init__() 再回到 dump() 又一次?


更新

如何使用 pdb 有效探索 Jupyter notebook?

一种可能的解决方案

  1. 仅使用 pdb.set_trace
  2. set_trace是在当前代码块的层次上追溯细节,不会深入到下一个内层函数。
  3. 比如我在dump()里面放了一个pdb.set_tracepdb就不会帮我追踪到parse_kurfile()的功能了,但留在当前 dump() 块:

    def 转储(参数): """ 将 Kurfile 作为 JSON blob 转储到标准输出。 """ pdb.set_trace() ### 将 kurfile.yml 解析为要在 python 代码中使用的部分 规格 = parse_kurfile(args.kurfile, args.engine)

  4. 如果我想更深入地了解__main__.py中的parse_kurfilekurfile.py中的Kurfile.__init__,那么我只需要放一个pdb.set_trace 在两个函数中,如下所示:


更新

根据我目前的经验,有两个库 inspectpprintpdb 库配合得很好。

里面的库inspect,我用的最多的函数是:

  1. inspect.getdoc: 查看函数的文档
  2. inspect.getmodule: 找出这个函数或对象来自哪里
  3. inspect.getfullargspec:找出函数接受的所有输入
  4. inpsect.getsourceliens:获取函数源码

有了上面的这些功能,当我想查看其他功能时,我不必去编辑器中查找源代码,我可以在pdb中看到它们。

来自库 pprint,你可以猜到,我使用 pprint.pprint 打印源代码,pdb.[=47= 中的文档以更易读的格式打印出来]


更多更新

用于探索和实验的工作站来源:

  1. 使用atom拆分window并同时查看不同的源文件;
  2. 使用iterm2拆分window并使用ipython执行python或bash代码
  3. 按以下方式组织它们:


更多更新

在探索过程中,我想把一个模块或class的所有属性和方法都准备好。

实现,我可以用inspect.getmembers(module or class name),用iterm2拆分window查看:


更新:如何改变iterm2眼睛的颜色?

转到 iterm2 preferencescolor,更改为 Tango Dark,将 foreground color 变灰以使白色文本看起来柔和

将 Kur 记录器颜色设置更改为:

## logcolor.py
# Color codes for each log-level.
COLORS = {
    'DEBUG': BLUE,
    'INFO': MAGENTA,
    'WARNING': RED,
    'ERROR': RED,
    'CRITICAL': GREEN
}

如何在Jupyter notebook中高效使用pdb

在 Jupyter 中避免 pdb 缺点的一种方法:

  • 将notebook下载成py文件
  • import pdbpdb.set_trace() 等代码插入 python 代码
  • 在控制台中,运行 python your.py
  • 现在您可以像在上面的答案中那样探索这个 py 文件