目前我们项目代码注释少、代码风格差异大,会导致交接时间长、交接后故障多的问题。针对这种情况,我们应该统一代码风格,增加代码注释,减少交接维护的成本。在此,总结了一些有用的Python规范,欢迎大家补充。
编码规范
严格的pep8规范太繁琐,推荐使用谷歌规范,此规范提供了一套简洁有效的注释和编码风格,上手十分容易。而且pycharm会针对注释做一些静态检查,可以进一步降低代码问题。以下是根据经验添加的一些补充。
函数注释
我们的项目几乎没有函数注释,一些关键性的函数添加合适的注释是十分有必要的,不需要太多的解释,只需要正确的表明入参类型和含义、返回参数类型和含义以及可能出现的异常。这些信息对刚上手的人来说十分有用,不仅可以快速读懂,而且也更方便地定位问题和代码检视。举例如下:
def del_message(consumer_id, message_id):
"""删除消息
Args:
consumer_id (int): 接收人id
message_id (int): 消息id
Returns:
code (string): 操作返回码
"""
code, _ = mysql_model.delmsg(consumer_id, message_id)
mysql_model.querymsg.invalidate_consumer(consumer_id)
redis_model.del_unread_message(consumer_id, [message_id])
return code
pycharm的审阅功能会根据注释仲标注的类型检查代码,如果不匹配,会有颜色标记,可以更早的发现问题。
import
除了不要将多个模块或者符号放在一行导入的规则以外,也需要对导入模块的顺序做一个规范:按照python自带模块、第三方模块、项目模块的顺序导入,在管理模块的时候会更有条理。举例如下:
import time
import ujson
import functools
from retrying import retry
from msgcenter.models import (
mysql_model,
push_model,
redis_instance,
)
from msgcenter.core import constants
from msgcenter.pb import (
stub,
urlsitter_pb2,
)
字符串拼接
不要使用%和+拼接字符串,推荐使用format拼接。
'{}{}'.format(a, b)
原因是format比%拼接针对动态类型有更好的容错处理,而+运算符拼接字符串会有不必要的内存拷贝,性能不高。
性能改进
使用正确的模块和函数提升性能。
循环
- 用xrange替换range
- 遍历字典时,用iteritems替换items
- 简单的循环逻辑,用列表推导或者map/reduce/filter替换for/while循环
库
第三方c扩展库相对原生库性能更好:
- ujson替换json
- cPickle替换pickle
- cStringIO替换stringIO
- cProfile替换profile
- 大数据情况下用numpy替换原生list操作
内存
- tuple相对list占用内存更少,针对不会改变数据的场景使用tuple
- 列表仲的字符串拼接避免使用+操作,可以使用join函数,eg:
','.join(a)
- 常用的整数枚举值定义在[-5, 255]范围内
- 不需要继承的类定义
__slot__
其他
- set和dict的in操作时间复杂度是O(1), list和tuple是O(n)
- dict对象以string类型数据作为key
- dict操作以
1 in a
替换a.has_key(1)
- 禁止更改python默认编码格式,编码问题有其他更好的解决方案
- 禁止修改sys.path, 导入问题可以通过设置环境变量PYTHONPATH解决
- 复杂的sql拼接可以用orm替换,参考gitlab kingkong项目
网友评论