编程基础与实践

读书笔记(6): 编写高质量python代码的59个有效方法-完

2020-09-23  本文已影响0人  阿瑟_TJRS

前言

《编写高质量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):

  1. 模块编写文档: 作为源文件的第一语句,使用三重双引号括起来; 描述本模块的用途,介绍本模块的相关操作,强调本模块比较重要的类和函数,以便于开发者能够了解该模块的用法

  2. 为类编写文档 一段话阐述本类的用途,详述类的操作方式

  3. 为函数编写文档 一句话描述本函数的功能,然后一段话描述具体行为和参数及输出

用虚拟环境隔离项目,重建依赖关系

通过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

上一篇 下一篇

猜你喜欢

热点阅读