前言
《编写高质量python代码的59个有效方法》这本书分类逐条地介绍了编写python代码的有效思路和方法,对理解python和提高编程效率有一定的帮助。本笔记简要整理其中的重要方法。
承接上文https://www.jianshu.com/p/15a6050220e6
https://www.jianshu.com/p/1f6a2b3b502e
元类与属性 https://www.jianshu.com/p/1b1f3a0e87aa
并发及并行:https://www.jianshu.com/p/60ad9066d4b6
https://www.jianshu.com/p/60ad9066d4b6
本次分享书中最后两章:关于协作开发和部署
7. 协作开发
编写文档字符串 docstring
Python为文档提供了内置的支持,使得开发者可以把文档于代码块关联起来。 能够在程序运行时之间访问源代码中的文档信息。
"""
This is the description of this object
"""
def __init__(self):
self.count=1
def train(self):
print('basemodel')
print(self.count)
pass
def test(self):
pass
class Model(Basemodel):
def __init__(self):
super().__init__()
self.count=2
# def train(self):
# print(self.count)
print(repr(Basemodel.__doc__))
例如这个例子,可以直接通过repr()来获取类的doc即文档信息。在编写文档字符串时,应该遵守相关规范(PEP 257):
-
为模块编写文档: 作为源文件的第一语句,使用三重双引号括起来; 描述本模块的用途,介绍本模块的相关操作,强调本模块比较重要的类和函数,以便于开发者能够了解该模块的用法
-
为类编写文档 一段话阐述本类的用途,详述类的操作方式
-
为函数编写文档 一句话描述本函数的功能,然后一段话描述具体行为和参数及输出
用虚拟环境隔离项目,重建依赖关系
通过pyvenv的工具构建虚拟环境,方便创建版本不同/内部软件包不同的环境
8. 部署
用模块级别的代码来配置不同的部署环境
可以根据不同的部署环境(生产/测试),覆写程序中的某些部分,根据环境不同提供不同的功能,如下例所示 还可以通过查询环境变量来确定选用模型的不同内容,下面的例子中利用sys查询当前的操作系统repr字符串输出调试信息
print函数往往无法清晰地展示数据的类型,在调试程序时往往需要知道具体的类型,可以使用内置的repr来返回可打印的表示形式,
对于类调试,可以考虑自定义repr函数,重建该对象:class Basemodel(object):
"""
This is the description of this object
"""
def __init__(self):
self.count=1
def train(self):
print('basemodel')
print(self.count)
pass
def test(self):
pass
def __repr__(self):
return 'test'#self.__dict__#['count']
t=Basemodel()
print(t)
用unittest测试全部代码
Python没有静态类型检查机制,编译器无法保证程序在运行时一定正确执行。Python的动态特性,阻碍了静态类型检查;此外也能方便开发者为代码编写测试。可以使用内置的unittest模块
def to_str(data):
if isinstance(data,str):
return data
elif isinstance(data,bytes):
return data.decode('utf-8')
else:
raise TypeError('Must supply str or bytes, found : %r'%data)
class UtilsTestCase(TestCase):
def test_to_str_bytes(self):
self.assertEqual('hello',to_str(b'hello'))
UtilsTestCase().test_to_str_bytes(
pdb交互调试
内置的交互调试器pdb,可以查看程序状态、打印局部变量,按照步进的方式执行程序中的每一个语句。
在需要调试的地方加上这调试命令,相当于打断点。
def test_example():
for i in range(10):
import pdb
pdb.set_trace()
print(i)
test_example()
具体的交互调试指令包括: step/next/return/continue等
性能分析
Python提供内置的性能分析工具: profiler,并将获取的性能数据通过内置的pstats模块对数据进行统计分析,对性能分析数据进行筛选和排序,提取关键的执行时长信息:
from pstats import Stats
def func(m,n):
a=b=result=1
minNI=min(n,m-n)
for j in range(0,minNI):
a=a*(m-j)
b=b*(minNI-j)
result=a//b
return result
profiler=Profile()
profiler.runcall(lambda : func(152324,27343))
stats=Stats(profiler)
stats.strip_dirs()
stats.sort_stats('cumulative')
stats.print_stats()
stats.print_callers()
因此在对python程序优化前,最好先利用profile对程序做初步的性能分析
用tracemalloc掌握内存使用及泄露情况
Python可以使用内置的gc模块,可以找到当前垃圾收集器所集的所有对象, 但gc的问题在于无法确认具体分配情况,可以使用tracemalloc来获取更详细的情况: 目前tracemalloc仅支持Python3.4以上版本END
本人简书所有文章均为原创,欢迎转载,请注明文章出处 。百度和CSDN等站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的笔记/博文进行更新,因此请访问本人简书主页查看最新信息https://www.jianshu.com/u/40d14973d97c
网友评论