如何使用 `pdb`、`inspect`、`pprint` 试验源代码?
How to experiment source code with `pdb`, `inspect`, `pprint`?
问题
- 我想了解Kur(深度学习库)的源码
- 我没有接受过适当的编程培训,我更喜欢在没有先验理论知识的情况下通过实验来学习
- 我想要一个简单的工具来帮助我深入研究源代码的详细工作原理
- 调试工具就像
pdb
库似乎是一个不错的选择
- 但是开始使用
pdb
试验源代码的最简单方法是什么?
- 我只想写一行代码来深入细节,而不是像许多示例中展示的那样写几行代码 google
pdb
换句话说,我应该使用pdb
的哪个功能?以及如何有效地将其用于实验源?
玩具示例
- 我想探索
kur dump mnist.yml
的内部运作
- 为了简单起见,我只想探索不超过
__main__.py
和 kurfile.py
。
- 更具体地说,我想探索
__main__.py
中的 dump()
和 parse_kurfile()
,以及 kurfile.py
中的 Kurfile.__init__()
他们的关系如下:
控制台:kur dump mnist.yml
-->
python: __main__.py
: main()
--> dump()
--> parse_kurfile()
-->
python: kurfile.py
: Kurfile
class --> __init__()
...
python:……剩下的就不去探究了
我应该使用 pdb
的哪个函数来探索从 dump()
到 parse_kurfile()
再到 Kurfile.__init__()
再回到 dump()
又一次?
更新
如何使用 pdb
有效探索 Jupyter notebook?
pdb
Jupyter 内部甚至无法记住控制台历史记录,不好
一种可能的解决方案
- 仅使用
pdb.set_trace
set_trace
是在当前代码块的层次上追溯细节,不会深入到下一个内层函数。
比如我在dump()
里面放了一个pdb.set_trace
,pdb
就不会帮我追踪到parse_kurfile()
的功能了,但留在当前 dump()
块:
def 转储(参数):
""" 将 Kurfile 作为 JSON blob 转储到标准输出。
"""
pdb.set_trace()
### 将 kurfile.yml 解析为要在 python 代码中使用的部分
规格 = parse_kurfile(args.kurfile, args.engine)
如果我想更深入地了解__main__.py
中的parse_kurfile
和kurfile.py
中的Kurfile.__init__
,那么我只需要放一个pdb.set_trace
在两个函数中,如下所示:
更新
根据我目前的经验,有两个库 inspect
和 pprint
与 pdb
库配合得很好。
里面的库inspect
,我用的最多的函数是:
inspect.getdoc
: 查看函数的文档
inspect.getmodule
: 找出这个函数或对象来自哪里
inspect.getfullargspec
:找出函数接受的所有输入
inpsect.getsourceliens
:获取函数源码
有了上面的这些功能,当我想查看其他功能时,我不必去编辑器中查找源代码,我可以在pdb
中看到它们。
来自库 pprint
,你可以猜到,我使用 pprint.pprint
打印源代码,pdb
.[=47= 中的文档以更易读的格式打印出来]
更多更新
用于探索和实验的工作站来源:
- 使用
atom
拆分window并同时查看不同的源文件;
- 使用
iterm2
拆分window并使用ipython
执行python或bash代码
- 按以下方式组织它们:
更多更新
在探索过程中,我想把一个模块或class的所有属性和方法都准备好。
实现,我可以用inspect.getmembers(module or class name)
,用iterm2
拆分window查看:
更新:如何改变iterm2眼睛的颜色?
转到 iterm2 preferences
、color
,更改为 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 pdb
和 pdb.set_trace()
等代码插入 python 代码
- 在控制台中,运行
python your.py
- 现在您可以像在上面的答案中那样探索这个 py 文件
问题
- 我想了解Kur(深度学习库)的源码
- 我没有接受过适当的编程培训,我更喜欢在没有先验理论知识的情况下通过实验来学习
- 我想要一个简单的工具来帮助我深入研究源代码的详细工作原理
- 调试工具就像
pdb
库似乎是一个不错的选择 - 但是开始使用
pdb
试验源代码的最简单方法是什么? - 我只想写一行代码来深入细节,而不是像许多示例中展示的那样写几行代码 google
pdb
换句话说,我应该使用pdb
的哪个功能?以及如何有效地将其用于实验源?
玩具示例
- 我想探索
kur dump mnist.yml
的内部运作
- 为了简单起见,我只想探索不超过
__main__.py
和kurfile.py
。 - 更具体地说,我想探索
__main__.py
中的dump()
和parse_kurfile()
,以及kurfile.py
中的 他们的关系如下:
控制台:
kur dump mnist.yml
-->
python:__main__.py
:main()
-->dump()
-->parse_kurfile()
-->
python:kurfile.py
:Kurfile
class -->__init__()
...
python:……剩下的就不去探究了我应该使用
pdb
的哪个函数来探索从dump()
到parse_kurfile()
再到Kurfile.__init__()
再回到dump()
又一次?
Kurfile.__init__()
更新
如何使用 pdb
有效探索 Jupyter notebook?
pdb
Jupyter 内部甚至无法记住控制台历史记录,不好
一种可能的解决方案
- 仅使用
pdb.set_trace
set_trace
是在当前代码块的层次上追溯细节,不会深入到下一个内层函数。比如我在
dump()
里面放了一个pdb.set_trace
,pdb
就不会帮我追踪到parse_kurfile()
的功能了,但留在当前dump()
块:def 转储(参数): """ 将 Kurfile 作为 JSON blob 转储到标准输出。 """ pdb.set_trace() ### 将 kurfile.yml 解析为要在 python 代码中使用的部分 规格 = parse_kurfile(args.kurfile, args.engine)
如果我想更深入地了解
__main__.py
中的parse_kurfile
和kurfile.py
中的Kurfile.__init__
,那么我只需要放一个pdb.set_trace
在两个函数中,如下所示:
更新
根据我目前的经验,有两个库 inspect
和 pprint
与 pdb
库配合得很好。
里面的库inspect
,我用的最多的函数是:
inspect.getdoc
: 查看函数的文档inspect.getmodule
: 找出这个函数或对象来自哪里inspect.getfullargspec
:找出函数接受的所有输入inpsect.getsourceliens
:获取函数源码
有了上面的这些功能,当我想查看其他功能时,我不必去编辑器中查找源代码,我可以在pdb
中看到它们。
来自库 pprint
,你可以猜到,我使用 pprint.pprint
打印源代码,pdb
.[=47= 中的文档以更易读的格式打印出来]
更多更新
用于探索和实验的工作站来源:
- 使用
atom
拆分window并同时查看不同的源文件; - 使用
iterm2
拆分window并使用ipython
执行python或bash代码 - 按以下方式组织它们:
更多更新
在探索过程中,我想把一个模块或class的所有属性和方法都准备好。
实现,我可以用inspect.getmembers(module or class name)
,用iterm2
拆分window查看:
更新:如何改变iterm2眼睛的颜色?
转到 iterm2 preferences
、color
,更改为 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 pdb
和pdb.set_trace()
等代码插入 python 代码 - 在控制台中,运行
python your.py
- 现在您可以像在上面的答案中那样探索这个 py 文件