Effective python(八):部署
一,考虑使用模块级别的代码区分生产环境和调试环境
二,通过repr字符串来输出调试信息
1,repr函数会根据对象返回可供打印的表示形式
2,想要调整对象的可打印状态,可以设置__repr__
属性,直接打印对象即可,或者通过__str__
属性,先调用str(obj)
再打印,也可以打印对象的属性print(obj.__dict__)
三,使用unittest测试全部代码
1,unittest模块中的TestCase提供了一些辅助方法,assertEqual可以判断两值是否相等,assetTrue可以验证Boolean表达式是否为真,assertRaises可以验证程序是否能在适当时机抛出异常
2,除了单元测试,还有集成测试,用来验证模块之间是否能正确的互动
四,使用pdb实现交互式调试
1,import pdb; pdb.set_trace()
执行到这行语句,程序就会暂停,执行程序的终端会转入交互式的python提示符界面,输入局部变量名称可以打印他们的值,还可以引入状态,检视全局状态等等
五,先分析性能再优化
1,对生成器,字符串各种操作很快,但属性访问及函数调用却很慢,不能靠直觉判断,需要用工具去分析,一个是profiler,一个是cProfile,建议用cProfile更准确,还需再使用pstats模块中的Stats类来剖析收集到的数据
profiler=Profile()
profiler.runcall(test)
stats=Stats(profiler)
stats.strip_dirs()
stats.sort_stats('cumulative')
stats.print_stats()
stats.print_callers()#打印函数的调用者,并显示耗费时间
六,使用tracemalloc掌握内存使用及泄漏情况
1,可以通过该模块查看那块代码占用内存大
可以直接留言交流问题或想法,每天都会看