开发十年,就只剩下这套Java开发体系了 >>>   

PEP8规范总结

PEP8 是什么呢,简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读。 具体有这些规范,参考 PEP 8 --Style Guide for Python Code.当然也可以使用Pycharm检查或使用pylint.下面是规范总结

缩进

  • 不要使用 tab 缩进
  • 使用任何编辑器写 Python,请把一个 tab 展开为 4 个空格
  • 绝对不要混用 tab 和空格,否则容易出现 IndentationError

空格

  • 在 list, dict, tuple, set, 参数列表的 , 后面加一个空格
  • 在 dict 的 : 后面加一个空格
  • 在注释符号 # 后面加一个空格,但是 #!/usr/bin/python 的 # 后不能有空格
  • 操作符两端加一个空格,如 +, -, *, /, |, &, =
  • 接上一条,在参数列表里的 = 两端不需要空格
  • 括号((), {}, [])内的两端不需要空格

空行

  • 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, third=third) \.skip(100).limit(100) \.all()text = ('Long strings can be made up ''of several shorter strings.')

命名

  • 使用有意义的,英文单词或词组,绝对不要使用汉语拼音
  • package/module 名中不要出现 -
  • 各种类型的命名规范:
Type public Inernal
Modules lower_with_under _lower_with_under
Packages lower_with_under
Classes CapWords _CapWords
Exceptions CapWords
Functions lower_with_under() _lower_with_under()
Global/Class Constans 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
Method Names lower_with_under() _lower_with_under(protected)or __lower_with_under
Function/Method Parameters lower_with_under
Local Variables lower_with_under

import

  • 所有 import 尽量放在文件开头,在 docstring 下面,其他变量定义的上面
  • 不要使用 from foo imort *
  • import 需要分组,每组之间一个空行,每个分组内的顺序尽量采用字典序,分组顺序是:
  1. 标准库
  2. 第三方库
  3. 本项目的 package 和 module

不要使用隐式的相对导入(implicit relative imports),可是使用显示的相对导入(explicit relative imports),如 from ..utils import parse,最好使用全路径导入(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 或导入上一级命名空间
  • 不要出现循环导入(cyclic 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 后面需要指定捕捉的异常,裸露的 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)db.session.commit() # 可能抛出异常
except:db.session.rollback()# 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:db.session.commit()
except sqlalchemy.exc.SQLAlchemyError: # 或者更具体的异常db.session.rollback()
finally:db.session.close()
  • 从 Exception 而不是 BaseException 继承自定义的异常类

Class(类)

  • 显示的写明父类,如果不是继承自别的类,就继承自 object 类
  • 使用 super 调用父类的方法
  • 支持多继承,即同时有多个父类,建议使用 Mixin

字符串

  • 使用字符串的 join 方法拼接字符串
  • 使用字符串类型的方法,而不是 string 模块的方法
  • 使用 startswith 和 endswith 方法比较前缀和后缀
  • 使用 format 方法格式化字符串

比较

  • 空的 list, str, tuple, set, dict 和 0, 0.0, None 都是 False
  • 使用 if somelist 而不是 if len(somelist) 判断某个 list 是否为空,其他类型同理
  • 使用 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()
# bad
if d.has_key(k):do_something()# good
if k in d:do_something()
  1. 用 set 加速 “存在性” 检查,list 的查找是线性的,复杂度 O(n),set 底层是 hash table, 复杂度 O(1),但用 set 需要比 list 更多内存空间

其他

  • 使用列表表达式(list comprehension),字典表达式(dict comprehension, Python 2.7+) 和生成器(generator)
  • dict 的 get 方法可以指定默认值,但有些时候应该用 [] 操作,使得可以抛出 KeyError
  • 使用 for item in list 迭代 list, for index, item in enumerate(list) 迭代 list 并获取下标
  • 使用内建函数 sorted 和 list.sort 进行排序
  • 适量使用 map, reduce, filter 和 lambda,使用内建的 all, any 处理多个条件的判断
  • 使用 defaultdict (Python 2.5+), Counter(Python 2.7+) 等 “冷门” 但好用的标准库算法和数据结构
  • 使用装饰器(decorator)
  • 使用 with 语句处理上下文
  • 有些时候不要对类型做太过严格的限制,利用 Python 的鸭子类型(Duck Type)特性
  • 使用 logging 记录日志,配置好格式和级别
  • 了解 Python 的 Magic Method:A Guide to Python’s Magic Methods, Python 魔术方法指南
  • 阅读优秀的开源代码,如 Flask 框架, Requests for Humans
  • 不要重复造轮子,查看标准库、PyPi、Github、Google 等使用现有的优秀的解决方案

Python PEP8规范整理相关推荐

  1. Python—PEP8规范

    Python-PEP8规范 介绍 代码布局 模块导入顺序 空格 注释 注释块 命名风格 应避免的名字 模块名 类名 异常名 全局变量名 函数名 方法名和实例变量名 设计建议 Python思维导图: / ...

  2. python编码规范手册-PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  3. PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  4. pep8 python 编码方式_PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  5. python编码规范手册-python之(8)Python编码规范整理

    我是用Python的IDE:pycharm来编写Python代码的,用IDE编写代码有一个好处就是语法高亮,智能提示.Python的代码样式规范称之为PEP 8规范,每次编写代码如果有出现不符合PEP ...

  6. python编码规范手册-python 编码规范整理

    前言 项目中代码风格规范的好处: 好处1:代码风格的统一可以很好地提高代码的可读性.制定一个相同的代码风格,如直接选用Python的PEP8官方风格指南,严格遵守后可以得到美观又统一风格的项目代码,这 ...

  7. pep8 python 编码规范下载_PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天根据PEP8整理了一份,以后都照此编码了, ...

  8. python PEP8规范

    1.使用4个空格而不是tab键进行缩进. 2.每行长度不能超过79 3.使用空行来间隔函数和类,以及函数内部的大块代码 4.必要时候,在每一行下写注释 5.使用文档注释,写出函数注释 6.在操作符和逗 ...

  9. python规范pep8_Python—PEP8规范

    Python-PEP8规范 介绍 代码布局 模块导入顺序 空格 注释 注释块 命名风格 应避免的名字 模块名 类名 异常名 全局变量名 函数名 方法名和实例变量名 设计建议 Python思维导图: / ...

最新文章

  1. Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)
  2. 虚拟化方案应用场景及优劣
  3. selenium速度_RPA UiPath和Selenium,谁是测试套件?
  4. 【python 2】python 进阶
  5. IDEA 点击进入方法内部_Idea中,听说会了Debug,你就离大佬不远了!
  6. fibonacci数列前20项_数学第十七课:数列综合应用第一弹
  7. SQLi LABS Less-19
  8. 深度学习自学(十):人脸检测android端-JNI调试调用底层检测识别库
  9. 阿里算法工程师模拟题2018/5/7
  10. git---怎样将分支上的一个单文件合并到主分支上(master)
  11. spark使用KryoRegistrator java代码示例
  12. 图像处理之前景检测(三)之码本(codebook)(主要为代码升级)
  13. 【软件工具】--- 软件安装管家目录
  14. CText更新至V1.1.0
  15. flash用的什么语言
  16. 树莓派屏幕显示No Signal
  17. 【SQL注入】 sql注入中的union和limt关键字的使用解析
  18. linux集显驱动程序,Ubuntu14.04安装intel集显驱动
  19. 财税SaaS起风,税友股份成“中国版Intuit”?
  20. 一个需求价值评估的方法——靶图

热门文章

  1. jdk的环境变量,javac不是内部命令,也不是可运行的程序”的解决
  2. matlab差分算子的灰度图像边缘检测,灰度图像的 Sobel 边缘检测算法的 HDL实现(一)...
  3. SpringMVC拦截器与Filter过滤器
  4. 怎样把截图转换成文字?三分钟教会你如何截图转文字
  5. Redis下载安装与配置(linux)
  6. 17款漂亮的 HTML5 网站模板免费下载
  7. VB开发源码+视频教程大集合
  8. Poker 键盘试用
  9. 基于8051的电子密码锁程序
  10. 有个人发现了一个在网吧忘了关掉的QQ后……