当前位置: 首页 > 科技观察

推荐3款强大的工具,帮你写出规范漂亮的Python代码

时间:2023-03-15 22:37:51 科技观察

Python学了很久,出来review的代码总觉得不够漂亮整洁!因此,标准化的代码规范就显得尤为重要。今天给大家推荐3款利器,python社区广泛认可的代码风格规范PEP8,以及两个超级牛逼的工具pylint和black,分别用于代码风格规范检测和自动优化。一、代码风格规范PEP8首先说说为什么要使用PEP8。我们先看下面的代码。定义好相关函数后,就可以正常编译执行了,但是这段代码怪异的风格,别人看不懂。自己看书还是有难度的。这需要一个普遍认可的代码风格规范,统一行长、缩进、多行表达式、变量命名约定等,这就是PEP8的意义。需要注意的是,PEP8中的一些规范是为了阅读方便,而一些规范实际上会影响代码的性能、容错率或重构难度。比如上面的代码中,foo函数只有在满足条件的时候才返回一个值,而bar函数只有在不满足条件的时候才返回一个值。这样代码兼容性会比较差。正确的做法是保持代码一致性,函数中的return语句应该返回一个表达式,否则不返回:PEP8的简单介绍就到这里,有兴趣的朋友可以自行查阅文档。当我们打开文档,我们会发现PEPE8规范的内容非常详细。作为一个新手,要将这些规定一一解读并记住并不容易。但是,对于新手来说,养成良好的编码习惯是非常重要的。下面正式进入正题,介绍两款简单实用的代码自动化检测优化工具,可以帮助我们快速规范自己的代码风格。2.自动检测工具PylintPylint是一个检查违反PEP8规范和常见错误的库。自动发现不符合代码风格标准、存在潜在问题的代码,并在控制台输出代码中违规和问题的相关信息。1).安装与使用其他python库一样,直接pipinstallpylint即可完成安装。另外,anaconda自带pylint,所以如果你已经安装了anaconda,就不需要单独安装这个库了。pylint的使用也很简单。最基本的用法是直接在控制台输入pylint路径/模块名,检查相关模块的代码风格规范,检查结果会输出到控制台。建议结合pylint--help的提示进行学习和检索。介绍完pylint的基本情况,下面我们通过一个例子来详细描述一下。2).示例演示。在这里找到了一段我第一次学习python时写的代码用于测试:importpandasaspddata=[]char_replace_dict={':':'','(':'(',')':')',',':','}withopen('xmq_survey.txt','r',encoding='utf-8')asfile:forlineinfile.readlines():forkey,valueinchar_replace_dict.items():line=line。replace(key,value)#本来这是一个深度引用#这段代码比我写的介绍多了pythondata.append(line)withopen('survey.txt','w',encoding='utf-8')asfile:forlineindata:file.write(line)raw_data=pd.read_table('survey.txt',delimiter='',header=None)#查看read_table函数的用法raw_data.columns=['Name','RawInfo']raw_data.count()print('successful')乍一看好像没什么大问题,但是pylint检查后,给出了一堆问题提示(下图),我们看看检查结果,每一个line大写+冒号开头的信息是反馈提示。开头的大写字母表示错误类型(主要是CRWEF);用逗号分隔的两个数字表示发现问题的位置(行和列);后面是对问题的具体描述,括号里的内容叫做messageid,可以简单理解为错误类型的详细分类,可以通过pylint--help-msg=命令查看该问题的详细信息。C——违反代码风格标准;R——糟糕的代码结构;W-关于细节的警告;E——代码错误;F-阻止Pylint继续运行的错误。比如我们执行pylint--help-msg=trailing-newlines命令,控制台会输出trailing-newlines问题的详细描述:pylint输出的最后一行是它对这次测试的分数,有一个满分10分,可以看到我的代码这次是0分T_T。既然知道了自己的代码哪里不规范,那我们就针对性的改正吧。根据提示结果,先去掉函数参数赋值=两边的空格,再去掉多余的空行,再次运行pylint测试,得到如下结果:刚才修改过的代码相关问题没有了,分数也从0提高到3.33。但是还是有很多问题,这里需要注意,PEP8并不是严格遵守的,当遵循PEP8规范时会使代码的可读性变差,并且会和周围的代码风格不一致,你还是要遵守你的自己的判断。在这种情况下,pylint也提供了可以手动屏蔽某些问题提示的操作。以刚才的代码为例,剩下的问题主要是Tab键的使用,变量命名不规范,文档缺失等问题。我们可以使用pylint--disable=mixex-indentation,invalid-name,missing-docstringmodulename命令屏蔽并重新测试相关规范,发现问题提示全部消除,分数也提升到10分。一个20行的代码就能检测出这么多问题提示。手动修改代码虽然对学习PEP8规范有帮助,但在工程文件多、脚本代码长的情况下,工作量确实很大。因此,就有了可以自动优化代码风格的工具。3、自动优化工具Black在众多代码格式化工具中,Black是比较新的一款。它最大的特点是可配置项少。个人认为这对新手来说是一件好事,因为我们不需要过多的考虑如何布黑,让黑自己做决定。1).安装使用和pylint类似,直接pipinstallblack安装模块即可,但black依赖Python3.6+,但仍然可以格式化Python2代码。在使用上,black默认读取指定的python文件并按照代码规范进行格式化,然后输出到原始文件中。l=[1,2,3,]比如我们将上面的代码保存为test.py,然后在控制台执行blacktest.py命令,再次打开test.py,发现里面的代码变成了这样this:l=[1,2,3]当然Black的封装度再高,也有自定义的配置项,比如使用--version查看版本,使用--help查看帮助信息,并使用--diff将修改后的信息输出到控制台,而不改变原始文件,下面用例子来演示一下。2).实例演示这里我们仍然使用pylint部分的代码进行演示。通过上面的操作,我们知道直接使用pylint测试这段代码会输出很多问题提示,给0分。现在我们首先将其格式化为黑色,得到以下代码:#-*-coding:utf-8-*-importpandasaspddata=[]char_replace_dict={':':'','(':'(',')':')',',':','}withopen('xmq_survey.txt','r',encoding='utf-8')asfile:forlineinfile.readlines():forkey,valueinchar_replace_dict.items():line=line.replace(key,value)#原创这是一篇深度参考#这段代码比我写的更简洁,也更pythondata.append(line)withopen('survey.txt','w',encoding='utf-8')asfile:forlineindata:file.write(line)raw_data=pd.read_table('survey.txt',delimiter='',header=None)#查看read_table函数raw_data的用法.columns=['Name','RawInfo']raw_data.count()print('successful')看起来修改前后的代码差异不是很明显。其实black已经对代码中的参数赋值=两端的空格,注释的格式,格式表的符号都进行了替换和修改。我们使用pylint进行验证,执行pylintmodulename命令,得到如下结果:可以看出,与原文件相比,分数从0提高到7.3,输出提示也少了。很多,剩下的问题主要是文档缺失和变量命名不规范。黑色对于提高我们的代码规范也是非常划算的。如果不想让black直接修改原文件,而是想看看它在哪里修改了代码,可以使用--diff参数执行black--difffilename,black会输出相关信息到对照台(下图中,-表示源代码,+表示建议修改后的代码),不修改原文件。总之,black真的是一个非常好用的库,尤其是对于新手来说,可以很方便的规范自己的代码风格。