1、Python 编码规范遵循良好编码风格,可以有效提高代码可读性,减少出错几率和维护难度。在团队开发中,使用(尽量)统一编码风格,还可以减少沟通成本。网上有诸多版本编码规范,基本上都是遵循 PEP8 规范: PEP 0008 Style Guide for Python Code Google Python 风格指南 Python Guide - Code Style Pocoo Styleguide除了在编码时积极遵循规范,尚有诸多有用工具: IntelliJ IDEA 和 PyCharm 格式化代码功能 Google 开源 Python 文献格式化工具: pyflakes,pylint 等工
2、具及各种编辑器插件本文内容重要摘自互联网上各种版本规范,由于公司有些小伙伴代码风格不太好,因此整顿了一份算是团队编码规范。缩进 不要使用 tab 缩进 使用任何编辑器写 Python,请把一种 tab 展开为 4 个空格 绝对不要混用 tab 和空格,否则容易浮现IndentationError空格 在 list,dict,tuple,set,参数列表,背面加一种空格 在 dict :背面加一种空格 在注释符号#背面加一种空格,但是#!/usr/bin/python#后不能有空格 操作符两端加一种空格,如+,-,*,/,|,&,= 接上一条,在参数列表里=两端不需要空格 括号((),)内两端不
3、需要空格空行 function 和 class 顶上两个空行 class method 之间一种空行 函数内逻辑无关段落之间空一行,不要过度使用空行 不要把各种语句写在一行,然后用;隔开 if/for/while 语句中,虽然执行语句只有一句,也要另起一行换行 每一行代码控制在 80 字符以内 使用或()控制换行,举例: def foo(first,second,third,fourth,fifth, sixth,and_some_other_very_long_param): user = User.objects.filter_by(first=first,second=second,th
4、ird=third) .skip(100).limit(100) .all() text = (Long strings can be made up of several shorter strings.)命名 使用故意义,英文单词或词组,绝对不要使用汉语拼音 package/module 名中不要浮现- 各种类型命名规范:TypePublicInternalModuleslower_with_under_lower_with_underPackageslower_with_underClassesCapWords_CapWordsExceptionsCapWordsFunctionslow
5、er_with_under()_lower_with_under()Global/Class ConstantsCAPS_WITH_UNDER_CAPS_WITH_UNDERGlobal/Class Variableslower_with_under_lower_with_underInstance Variableslower_with_under_lower_with_under(protected) or_lower_with_under(private)Method Nameslower_with_under()_lower_with_under()(protected) or_low
6、er_with_under()(private)Function/Method Parameterslower_with_underLocal Variableslower_with_underimport 所有 import 尽量放在文献开头,在 docstring 下面,其她变量定义上面 不要使用from foo imort * import 需要分组,每组之间一种空行,每个分组内顺序尽量采用字典序,分组顺序是:1. 原则库2. 第三方库3. 本项目 package 和 module 不要使用隐式相对导入(implicit relative imports),可是使用显示相对导入(expl
7、icit relative imports),如from .utils import validator,最佳使用全途径导入(absolute imports) 对于不同 package,一种 import 单独一行,同一种 package/module 下内容可以写一起: # bad import sys,os,time # good import os import sys import time # ok from flask import Flask,render_template,jsonify 为了避免也许浮现命名冲突,可以使用as或导入上一级命名空间 不要浮现循环导入(cycli
8、c import)注释 文档字符串docstring,是 package,module,class,method,function 级别注释,可以通过_doc_成员访问到,注释内容在一对符号之间 function,method 文档字符串应当描述其功能、输入参数、返回值,如果有复杂算法和实现,也需要写清晰 不要写错误注释,不要无谓注释 # bad 无谓注释 x = x + 1 # increase x by 1 # bad 错误注释 x = x - 1 # increase x by 1 优先使用英文写注释,英文不好所有写中文,否则更加看不懂异常 不要容易使用try/except except
9、背面需要指定捕获异常,裸露except会捕获所有异常,意味着会隐藏潜在问题 可以有各种except语句,捕获各种异常,分别做异常解决 使用finally子句来解决某些收尾操作 try/except里内容不要太多,只在也许抛出异常地方使用,如: # bad try: user = User() user.name = leon user.age = int(age) # 也许抛出异常 user.created_at = datetime.datetime.utcnow() db.session.add(user) mit() # 也许抛出异常 except: db.session.rollbac
10、k() # better try: age = int(age) except (TypeError,ValueError): return # 或别操作 user = User() user.name = leon user.age = age user.created_at = datetime.datetime.utcnow() db.session.add(user) try: mit() except sqlalchemy.exc.SQLAlchemyError:# 或者更详细异常 db.session.rollback() finally: db.session.close() 从
11、Exception而不是BaseException继承自定义异常类Class(类) 显示写明父类,如果不是继承自别类,就继承自object类 使用super调用父类办法 支持多继承,即同步有各种父类,建议使用 Mixin编码建议字符串 使用字符串join办法拼接字符串 使用字符串类型办法,而不是string模块办法 使用startswith和endswith办法比较前缀和后缀 使用format办法格式化字符串比较 空list,str,tuple,set,dict和0,0.0,None都是False 使用if some_list而不是if len(some_list)判断某个list与否为空,其
12、她类型同理 使用is和is not与单例(如None)进行比较,而不是用=和!= 使用if a is not None而不是if not a is None 用isinstance而不是type判断类型 不要用=和!=与True和False比较(除非有特殊状况,如在 sqlalchemy 中也许用到) 使用in操作:1. 用key in dict而不是dict.has_key()2. # bad3. if d.has_key(k):4. do_something()5.6. # good7. if k in d:8. do_something()9. 用set加速 “存在性” 检查,list查
13、找是线性,复杂度 O(n),set底层是 hash table,复杂度 O(1),但用set需要比list更多内存空间其她 使用列表表达式(list comprehension),字典表达式(dict comprehension,Python 2.7+) 和生成器(generator) dictget办法可以指定默认值,但有些时候应当用操作,使得可以抛出KeyError 使用for item in list迭代list,for index,item in enumerate(list)迭代list并获取下标 使用内建函数sorted和list.sort进行排序 适量使用map,reduce,f
14、ilter和lambda,使用内建all,any解决各种条件判断 使用defaultdict(Python 2.5+),Counter(Python 2.7+) 等 “冷门” 但好用原则库算法和数据构造 使用装饰器(decorator) 使用with语句解决上下文 有些时候不要对类型做太过严格限制,运用 Python 鸭子类型(Duck Type)特性 使用logging记录日记,配备好格式和级别 理解 Python Magic Method:A Guide to Pythons Magic Methods,Python 魔术办法指南 阅读先进开源代码,如Flask 框架,Requests for Humans 不要重复造轮子,查看原则库、PyPi、Github、Google 等使用既有先进解决方案