如何使用`pdb`,`inspect`,`pprint`来实验源代码?

时间:2017-03-26 08:25:17

标签: debugging pdb

问题

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

    换句话说,我应该使用pdb的哪个功能?以及如何有效地使用它来进行实验来源?

    玩具示例

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

      console:kur dump mnist.yml - >
      python:__main__.pymain() - > dump() - > parse_kurfile() - >
      python:kurfile.pyKurfile class - > __init__() ...
      python:...其余的不被探索

    7. 我应该使用pdb的哪个功能来探索从dump()parse_kurfile()再到Kurfile.__init__()再回到dump()的执行流程?

    8. 更新

      如何使用pdb有效地探索Jupyter笔记本?

        Jupyter里面的
      • pdb甚至不记得控制台的历史,不是很好

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案

  1. 仅使用pdb.set_trace
  2. set_trace跟踪当前代码块级别的详细信息,它不会更深入到下一个内部函数。
  3. 例如,当我在pdb.set_trace内放置一个dump()时,pdb将无法帮助我追踪parse_kurfile()的功能,但请留在当前dump()阻止:

    def dump(args):     """将Kurfile转储为stdout作为JSON blob。     """     pdb.set_trace()     ###将kurfile.yml解析成要在python代码中使用的部分     spec = parse_kurfile(args.kurfile,args.engine)

  4. 如果我想深入parse_kurfile中的__main__.pyKurfile.__init__中的kurfile.py,那么我只需要将pdb.set_trace加入inspect这两个函数中的每一个,如下所示:

  5. enter image description here

    <强>更新

    根据我的经验,目前有两个图书馆pprintpdb适合inspect图书馆。

    在库inspect.getdoc内,我最常使用以下函数:

    1. inspect.getmodule:查看函数文档
    2. inspect.getfullargspec:找出此功能或对象的来源
    3. inpsect.getsourceliens:找出func所需的所有输入
    4. pdb:获取函数的源代码
    5. 通过以上这些功能,当我想查看其他功能时,我不必去编辑器中查找源代码,我可以在pprint中找到它们。< / p>

      从库pprint.pprint,您可以猜测,我使用pdb打印出源代码,文档在atom内以更易读的格式打印。

      更新

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

      1. 使用iterm2拆分窗口并同时查看不同的源文件;
      2. 使用ipython拆分窗口并使用inspect.getmembers(module or class name)执行python或bash代码
      3. 按以下方式组织:
      4. enter image description here

        更新

        在探索期间,我希望手头有模块或类的所有属性和方法。

        为实现这一目标,我可以使用iterm2并使用preferences拆分窗口进行查看:

        enter image description here

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

        转到iterm2 colorTango Dark,更改为foreground color,灰色## logcolor.py # Color codes for each log-level. COLORS = { 'DEBUG': BLUE, 'INFO': MAGENTA, 'WARNING': RED, 'ERROR': RED, 'CRITICAL': GREEN } 以使白色文字看起来柔和

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

        # Create arrays
        arrays=[
            np.array([1,2,3]),
            np.array([4,5,6]),
            np.array([7,8,9])
        ]
        
        # Create an array to return to
        sample = np.array([])
        
        for array in arrays:
            sample = np.concatenate([sample, array])
        
        # Print results
        print('sample', sample)
        print('length', len(sample))
        

答案 1 :(得分:0)

如何在Jupyter笔记本中有效使用pdb

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

  • 将笔记本下载到py文件
  • 将代码import pdbpdb.set_trace()插入到python代码
  • 在控制台中,运行python your.py
  • 现在您可以像上面的回答一样探索这个py文件