python编码总结

目前我们项目代码注释少、代码风格差异大,会导致交接时间长、交接后故障多的问题。针对这种情况,我们应该统一代码风格,增加代码注释,减少交接维护的成本。在此,总结了一些有用的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项目

你可能感兴趣的:(python编码总结)