PEP代码规范
1 当一个判断条件太长以致于要换行的时候,可以使用()
将他们括起来,更好的可读性。()
会隐式的将他们连接起来
-
if 'a' == 'bba' and 'b' in ['bb','sds'] and isinstance('c',str) or a+b <= 10: print('sss') # 可以改写为以下代码 if ('a' == 'bba' and 'b' in ['bb','sds'] and isinstance('c',str) or a+b <= 10): print('sss')
2 注释不需要强行对齐,因为这会增加维护的难度
3 代码注释不需要描述代码,只需要说代码大概是干嘛的
4 如果一个类不继承其他类,就显式的从object继承
- 继承自object是为了使属性(properties)正常工作,可以保护代码
5 对于字符串的累加,避免在循环中使用 +
或 +=
进行字符串累加
-
由于字符串是不可变的,这样做会创建不必要的临时对象,并且导致二次方而不是线性的运行时间。
-
作为替代方案,可以将每个字符串加入列表,然后再循环结束后用
join()
连接列表,也可以将每个字符串写入一个cStringIO.StringIO
缓存中 -
Yes
-
item = ['<table>'] for last_name, first_name in employee_list: items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name)) item.append('</table>') employee_table = ''.join(items)
-
-
No
-
employee_table = '<table>' for last_name, first_name in employee_list: employee_table += '<tr><td>%s, %s</td></tr>' %(last_name, first_name) emplyee_table += '</table>'
-
6 文件和sockets
- 1在文件和sockets结束时,显示的关闭它
- 使用
with
语句以管理文件,会调用类中的__enter__()
和__exit__()
方法。- 对于不支持使用
with
语句的类似文件的对象,使用contextlib.closing()
语句
- 对于不支持使用
7 TODO注释
为了更好的记录临时代码,以及为了将来更好的找到哪些代码被标记了待处理,可以使用以下格式进行记录
可以添加邮箱、姓名、以及日期,为了更好的检索
# TODO(dujuntong33@163.com):这行代码有xx问题,还有什么xx问题没有处理 # TODO(dujuntong):xxxx #TODO(2021年4月解决)
8 导入格式
每个导入应该独占一行
Yes:
import os
import sys
No:
import os,sys
导入应该按照从最通用到最不通用的顺序分组
- 1 标准库导入
- 2 第三方库导入
- 3 应用程序指定导入
9 命名规范
Type | Public | Internal |
---|---|---|
Modules | lower_with_under | _lower_with_under |
Packages | lower_with_under | |
Classed | CapWords | _CapWords |
Exceptions | CapWords | |
Functions | lower_with_under() | _lower_with_under() |
Global/Class Constants | CAPS_WITH_UNDER | _CAPS_WITH_UNDER |
Global/Class Variables | lower_with_under | _lower_with_under |
Instance Variables | lower_with_under | _lower_with_under(protected) or __lower_with_under(private) |
Method Names | lower_with_under() | _lower_with_under()(protected) or __lower_with_under()(private) |
Function/Method Parameters | lower_with_under | |
Local Variables | lower_with_under |
- 使用下划线(
_
)开头表示模块变量或函数是protected的(使用import * from 时不包含) - 双下划线(
__
)开头的实例变量或方法表示类内私有
10 Main
-
代码应该在执行主程序前总是检查
if __name__ == '__main__'
,这样当模块被导入时主程序就不会被执行 -
def main(): ... if __name__ == '__main__': main()