Python 编码风格指南

0
回复
89
查看
打印 上一主题 下一主题
[复制链接]

19

主题

19

帖子

276

安币

手工艺人

楼主
发表于 2019-10-10 10:30:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果对本篇文章感兴趣,请?#24052;?#21407;文地址:http://www.sagwn.club/blog-985616-81461.html

访问Python官方网站的文档部分并搜索PEP,就可以获得PEP 8全文及Python历史上发布的所有其他PEP。PEP既是Python历史和经验的绝佳来源,也是当前议题和将来计划的解释。
访问Python官方网站的文档部分并搜索PEP,就可以获得PEP 8全文及Python历史上发布的所有其他PEP。PEP既是Python历史和经验的绝佳来源,也是当前议题和将来计划的解释。


01 简介

本文档给出的Python编码约定,适用于由Python主发行版本中的标准库构成的代码。有关Python的C实现中的C代码风格指南,参见相应的PEP。本文档改编自Guido最初的Python风格指南文章,并加入了Barry风格指南的一些内容。如果与Guido的风格规则存在冲突,应该遵从本PEP。本PEP可能尚未完结(其实可能永远不会完结)。
01

盲目的一致性是头脑简单的表现

Guido的一个重要观点是,代码被阅读的?#38382;?#36828;多于被编写的?#38382;?#26412;指南旨在提高代码的可?#21015;裕?#20351;各?#25351;?#26679;的Python代码能保持风格一致。正如PEP 20所述,“Readability counts?#20445;?#27880;重可?#21015;裕?/font>
风格指南是讨论一致性的。与风格指南保持一致很重要。维持同一个项目内部的一致性更加重要。而保证同一个模块和函数内部的一致性则最重要。
然而最最重要的是,知道?#38382;?#24212;打破一致性,有时风格指南并不适用。如果心存疑虑,请采用?#32422;?#30340;最佳判断。请看看别人的例子并做出最佳决定。不要犹豫,尽管发出疑问。
以下是两个打破规范的好理由。

  • 如果应用风格指南会让代码的可?#21015;?#21464;差,甚至对于习惯阅读遵守本规范代码的人来说也是如此。
  • 需要与周边的代码保持一致,而这些代码并未遵守规范(可能是历史原因造成?#27169;?#23613;管这?#37096;?#33021;是个?#24080;?#21035;人烂摊子的机会(真正的极限编程风格)。
01 代码布局


1.
缩进

每级缩进采用4个空格。
为了对付那些确实陈旧的代码,又不愿做出清理,那么可以继续沿用8个空格长度的制表符。


2.
制表符还是空格
绝对禁止制表符和空格的混用。
最流行的Python缩进方式是只使用空格。第二流行的方式是只使用制表符。混合使用制表符和空格进?#20852;?#36827;的代码,应该转换为只使用空格的方式。如果调用Python命令行解释器时带上-t?#38382;?#23427;就会对非法混用制表符和空格的代码发出警告。如果用了-tt?#38382;?#36825;些警告就会上升为错误。强烈推荐使用这些?#38382;?/font>
对全新?#21335;?#30446;而言,强烈建议只用空格缩进,换掉所有的制表符。大部分编辑器都具备将制表符替换为空格的便捷功能。


3.
最大行长
所有行都应限制在79个?#22336;?#20197;内。
将行长限制在80个?#22336;?#30340;设备还有很多,而且将窗口限制为80个?#22336;?#23485;就可以并排放置多个窗口。这些设备上的默认换行会破坏代码的外观,增加理解的难度。因此,请将所有行都限制在79个?#22336;?#20197;内。对于连续的大段文字(文档?#22336;?#20018;或注释),建议将行长限制在72个?#22336;?#20197;内。
对长行进行换行的首选方案,是利用Python隐含的行连接特性,在圆括号、方括号和大括号内部进行断行。必要时可以在表达式外面多加一对圆括号,不过有时候用反?#22791;?#20250;更好看些。请确保对后续行进行适当的缩进。打断二元运算符的首选位置是在运算符之后,而不是运算符之前。下面给出一些例子:
1 class  Rectangle(Blob):
2 def __init__(self, width, height,
3 color='black', emphasis=None, highlight=0):
4 if (width == 0 and height == 0 and\
5 color == 'red' and emphasis == 'strong' or \
6 highlight > 100):
7 raise ValueError("sorry, you lose")
8 if width == 0 and height == 0 and (color == 'red' or
9 emphasis is None):
10 raise ValueError("I don't think so -- values are %s, %s" %
11 (width, height))
12 Blob.__init__(self, width, height,
13 color, emphasis, highlight)



4.
空行
顶级函数和类定义之间,请用两个空行?#25351;簟?/font>
类内部的各个方法定义之间,请用1个空行?#25351;簟?/font>
为了让有关联的函数成组,可以在各函数组之间有节?#39057;?#28155;加空行。相互关联的一组单行函数之间,可以省略空行,如一组函数的伪实现(dummy implementation)。
函数内部可以有节?#39057;?#29992;空行来区分出各个逻辑部分。
Python可将Ctrl L(^L)换页符接受为空白符。很多工具都将其视为分页符,所以可以利用其进行分页,使得文件中的关联部分单独成页。


5.
导入
导入语句通常应单独成行,例如:
1import os
2import sys

不要像下面这样写在一起:
1import sys, os

不过下面的写法没有问题:
1from subprocess import Popen, PIPE

导入语句通常位于文件的顶部,紧挨着模块注释和文档?#22336;?#20018;后面,在模块全局变量和常量定义之前。
导入语句应按照以下顺序进行分组。
(1)标准库的导入。
(2)相关第三方库的导入。
(3)本地应用程序/库——特定库的导入。
每组导入语句之间请加入1个空行。
任何对应的__all__声明都应位于导入语句之后。
非常不推荐对内部包的导入使用相对导入语法。请始终对所有导入都使用绝对包路径。即便Python 2.5现在已完全实现了PEP 328,它?#21335;?#24335;相对导入语法也是强?#20063;?#25512;荐的。绝对导入的可移植性更好,通常可?#21015;?#20063;会更好。
如果是从包含类的模块中导入类,通常可以采用如下写法:
1from myclass import MyClass
2from foo.bar.yourclass import YourClass

如果上述写法会导致本地命名冲突,就采用如下写法:
1import myclass
2import foo.bar.yourclass

然后用myclass.MyClass和foo.bar.yourclass.YourClass表示类。


6.
表达式和语句内的空白符
讨厌之事——以下场合应避免使用多余的空白符。

  • 紧靠小括号、中括号或大括号内部。
正确:
1spam(ham[1], {eggs: 2})

错误:
1spam( ham[ 1 ], { eggs: 2 } )


  • 紧挨着逗号、分号或冒号之前。
正确:
1if x == 4: print x, y; x, y = y, x
错误:
1if x == 4 : print x , y ; x , y = y , x


  • 紧挨着函数?#38382;?#21015;表的左括号之前。
正确:
1spam(1)
错误:
1spam (1)


  • 紧挨着索引或切片操作的左括号之前。
正确:
1dict['key'] = list[index]
错误:
1dict ['key'] = list [index]

  • 为了与另一条?#25345;?#25110;其他语句对齐,在运算符两边使用多个空格。
正确:
1x = 1
2y = 2
3long_variable = 3

错误:
1x = 1
2y = 2
3long_variable = 3



7.
其他建议
始终在以下二元操作符两侧各放1个空格:?#25345;擔?)、增量?#25345;擔?=,-=等)、比较(==、<、>、!=、<>、<=、>=、in、not、in、is、is not)、布尔(and、or、not)。

  • 在数学运算符两侧放?#27599;?#26684;。
正确:
1i = i   1
2submitted  = 1
3
4x = x * 2 – 1
5hypot2 = x * x   y * y
6c = (a   b) * (a - b)

错误:
1i=i 1
2submitted  =1
3x = x*2 – 1
4hypot2 = x*x   y*y
5c = (a b) * (a-b)


  • 在用于指定关键字?#38382;?#25110;默认?#38382;?#20540;?#20445;?#35831;勿在=两边使用空格。
正确:
1def complex(real, imag=0.0):
2 return magic(r=real, i=imag)

错误:
1def complex(real, imag = 0.0):
2 return magic(r = real, i = imag)


  • 通常不鼓励使用复合语句,也就是在同一行放置多条语句。
正确:
1if foo == 'blah':
2 do_blah_thing
3do_one
4do_two
5do_three

最好不要:
1if foo == 'blah': do_blah_thing
2do_one; do_two; do_three


  • 虽然有时候将小块代码和if/for/while放在同一行没什么问题,但多行语句绝对不能如此。同?#34987;?#35201;避免过长代码行的折叠!
最好不要:
1if foo == 'blah': do_blah_thing
2for x in lst: total  = x
3 while t < 10: t = delay

绝对不要:
1if foo == 'blah': do_blah_thing
2else: do_non_blah_thing
3try: something
4finally: cleanup
5do_one; do_two; do_three(long, argument,
6 list, like, this)
7if foo == 'blah': one; two; three



  继续阅读全文



想在安卓巴士找到更多优质博文,可移步博客区

如果对本篇文章感兴趣,请?#24052;?br /> 原文地址:http://www.sagwn.club/blog-985616-81461.html
分享到:  QQ好友和群 QQ空间 微信
收藏
收藏0
支持
支持0
反对
反对0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:[email protected]

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )

招财童子彩金
时时彩技巧论坛 广场出租玩具定时车赚钱吗 淘宝快3qq群 吉林新快3开奖直播 1000每天稳赚本金20%图 5人炸金花技巧 11选五杀号软件赢财版 .下载 福彩3d三天计划独胆必下 五星定位胆稳赚公式 pk10龙虎技巧计划 河北快3和值走势图表 捕鱼平台下载 做化工赚钱年入160万 湖南转转麻将什么软件好 时时彩两千稳赚五百 陕西快乐10分开奖号码