Python风格规范

为了便于项目的管理和代码的阅读,养成良好的编码风格以及沟通方便,编码Python代码时应遵循以下编码规范:

  • 每行长度不超过80个字符
    每行代码的长度不超过80个字符
    不要使用反斜杠( \ ) 连接行.Python会将圆括号,中括号和花括号中的行隐式连接起来,可以利用这个特点
    例如,如果一个文本字符串在一行放不下,可以用圆括号来实现隐式行连接:
x = ('This will build a long long long long '
     'long long long long string')
  • 缩进使用4个空格缩进
    统一用4个空格缩进代码,编辑器的文件编码格式统一设置为uft-8格式,如:
# -*- coding: utf-8 -*-
# 可以在编辑器中设置Tab的缩进和文件编码
  • Shebang
    程序的main文件和可执行脚本应该以如下方式开始:
#!/usr/bin/env python
#!/usr/bing/python2.7

注:在计算机科学中,Shebang是由一个井号和感叹号构成的字符串(#!),其出现在文本的第一行的前两个字符.在文本中存在Shebang的情况下,类Unix操作系统的程序载入器会分析shebang后的内容,将这些词作为解释器命令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数.

  • 代码注释的使用
    API,Model,function和class都需要写注释,代码的关键部分和难懂的逻辑以及补丁都需要有注释,良好易读的代码注释是编程的基本要求.
    注释类型分为两种:文档注释用"""包围,行注释用#开头,后面空一格再写注释内容.
    Function的注释建议如下:
def logic_get_client_basic_info(client_list, fields, from_third_party=False):
    """
    Return a list of clients with basic information.

    Args:
        client_list: Client list, each element is a dict
        fields: Information fields to be returned
        from_third_party: If get basic info from third party open api. Note that
            if set this True, it will slow down the return speed

    Returns:
        A list of clients, fill with company basic information

    """
    names = list()
    client_dict = dict()

    for client in client_list:
        names.append(client[Customer.ContactField.name])
        client_dict[client[Customer.ContactField.name]] = client

    enterprises = list(Enterprise.s_col.find(
        {
            Enterprise.Field.name: {'$in': names}
        },
        fields
    ))
    found_names = list()
    for enterprise in enterprises:
        # 这里一定要使用 Enterprise 模型中的 name 字段替换搜索系统中的
        # name 字段,因为同一个公司可能在搜索系统中有几个名字,但是只有
        # 一个名字在 Enterprise 模型中存在
        name = enterprise[Enterprise.Field.name]
        found_names.append(name)
        enterprise.pop('_id')
        client_dict[name].update(enterprise)

    if from_third_party:
        # Check those names that not found
        lack_names = [_ for _ in names if _ not in found_names]
        ok, company_dict = logic_get_companies_by_fullname(lack_names)
        if ok:
            logic_update_into_enterprises(company_dict)

        lack_enterprises = list(Enterprise.s_col.find(
            {
                Enterprise.Field.name: {'$in': names}
            },
            fields
        ))
        for enterprise in lack_enterprises:
            name = enterprise[Enterprise.Field.name]
            enterprise.pop('_id')
            client_dict[name].update(enterprise)

    return [client_dict[_] for _ in names]

API或Model的注释用Markdown格式书写,方便调用脚本直接生成wiki,注释示例如下:

@api.route('/user', methods=['POST'])
def create_user():
    """
    ## Create User
    Extra information to describe this api.

        POST '/api/user'

    Params:
    * `username` (string) - User name
    * `password` (string) - Md5 user password
    * `signature` (string) *optional* - User signature

    Returns:
    * `_id` - New user id

    Errors: `1001`, `1002`

    ---
    """
    pass
  • 导入模块
    模块的导入按照系统自带模块,第三方模块和本项目模块的顺序导入,每种模块中间隔一个空行.每各种模块内根据模块的首字母按字典顺序排序.一行只能导入一个模块,若有多个需要导入,则用括号包围后换行.示例:
import os
import sys

from flask import (
  jsonify,
  request,
)

from logic.user import logic_get_user
from model.user import User

导入模块统一使用绝对路径.只导入需要的模块,应该避免

from . import xxx
from xxx.xxx import *

这种导入方式

  • 命令规范
    Python使用下划线命名法类名使用驼峰式命名方法,并且首字母大写.API接口的url使用短横线分割.所有常量使用大写+下划线表示法
  • 术语
    项目内的重要变量命名参照xxx项目术语表
  • 对编写的代码运行pylint
    pylint是一个在Python源代码中查找bug的工具,可以捕获容易忽视的错误,例如输入错误,使用未赋值的变量等.现在大部分Python代码编辑器中都有支持pylint
  • 时间的存储格式统一为utc datetime
    存入数据库的时间统一为utc datetime格式,前端传参或者后台返回参数给前端均先转换为时间戳然后再返回.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 更新时间:2016/5/13 介绍 本文档所提供的编码规范,适用于主要的Python发行版中组成标准库的Pytho...
    超net阅读 5,859评论 0 15
  • Python是一种对代码风格很重视的语言,从缩进就能看出这一点,Python强调易于理解。最近在负责代码重构的工作...
    知曰阅读 10,854评论 1 85
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,001评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 牛顿活了85岁,单身,妈妈汉娜在生他前3个月他农民爸爸就挂了,出生体重才3镑(不到1500克)。他妈妈在他3岁改嫁...
    红黄绿茶阅读 298评论 0 0