如何读懂python写的开源项目?你需要一个ipdb调试器(入门篇)

863 阅读2分钟
原文链接: zhuanlan.zhihu.com

有些同学在阅读他人所写的代码(比如github)时,往往会对他人定义的参数感到疑惑。因为光从参数的名字不能推断这些参数里究竟保存的是什么样的变量。不少同学只能一遍又一遍的用print来查看参数中保存的变量。遇到不熟悉的类时更是无从下手。

今天介绍一个Python的调试工具,叫做ipdb。有了这个再复杂的项目也能如抽丝剥茧般一点点揭开她的面纱。

安装ipdb最简单的方法就是

pip install ipdb

调用ipdb

python -m ipdb script.py

首先说明一下ipdb都有哪些功能。

不仅如此,你还可以直接定义参数和函数、导入模块并且调用他们。

基本操作

我从github中节选了一段代码github.com/openai/gym/…,假设左边的数字代表了代码在源文件中所处的行数。

77 n_elite = int(np.round(batch_size*elite_frac))
78 th_std = np.ones_like(th_mean) * initial_std
79
80 for _ in range(n_iter):
81    ths = np.array([th_mean + dth for dth in  th_std[None,:]*np.random.randn(batch_size, th_mean.size)])
82    ys = np.array([f(th) for th in ths])
83    elite_inds = ys.argsort()[::-1][:n_elite]
84    elite_ths = ths[elite_inds]
85    th_mean = elite_ths.mean(axis=0)
86    th_std = elite_ths.std(axis=0)
87    yield {'ys' : ys, 'theta_mean' : th_mean, 'y_mean' : ys.mean()}

1. 我想知道n_elite为何变量(方框内为直接在命令提示符中输入的内容)

连续按n直到第77行执行完毕
p n_elite

或者

b 78 # 在第78行设置断点
c # 正常执行代码,在断点处停止
p n_elite # 查看n_elite的值

2. 我想知道np是干什么的

pdoc np # 显示np的说明文档,python自带的模块大多有文档。自制模块不一定有

3. 我想知道np的源代码在哪

pinfo np # String form后面写的地址就是

4. 我想知道如果把batch_size的值换成其他值的计算结果

int(np.round(255*elite_frac))

5. 我想知道ths每一次的迭代后的变化

b 83 # 在第83行设置断点
p ths

6. 每次迭代都要停顿,我想删除这个断点

cl bpnumber # bpnumber是断点的序号

7. 我想知道f是什么函数

source f # 查看f的源代码

8. 我想知道elite_ths除了mean和std以外还有哪些可以调用的函数

dir(elite_ths)

9. 我想用pandas来编辑ths

import pandas as pd
ths_df = pd.DataFrame(ths)

10. 我想进入ones_like调试

j 77 # 跳到第77行,不过要注意跳转途中的代码不会被执行,所以有可能出现某参数没被定义的情况
s # 进入到下一步

11. 我当前在ones_like进行调试,我怎么调试n_elite

u # 回到上一层堆栈帧
p n_elite

12. 我当前在ones_like,我想结束调试返回上一层

r # 执行当前函数,返回值

13. 我想查看周围的代码

l或者ll

14. 我忘了怎么使用某个命令

h 某个命令

15. 我想重新调试但不想删除断点

run

下一期将会用ipdb解析github上某个项目。