编码规范

  • 编码

    • 如无特殊情况, 文件一律使用 UTF-8 编码
    • 如无特殊情况, 文件头部必须加入 #--coding:utf-8-- 标识
  • 缩进

    • 统一使用 4 个空格进行缩进
  • 引号

    • 自然语言 使用双引号 "...",例如错误信息;很多情况还是 unicode,使用u"你好世界"
    • 机器标识 使用单引号 '...' 例如 dict 里的 key,例如 dict 里的 key
    • 正则表达式 使用原生的双引号 r"..."
    • 文档字符串 (docstring) 使用三个双引号 """......"""
  • 空行

    • 模块级函数和类定义之间空两行
    • 类成员函数之间空一行
    • 可以使用多个空行分隔多组相关的函数
    • 函数中可以使用空行分隔出逻辑相关的代码
class A:

    def __init__(self):
pass def hello(self):
pass def main():
pass
  • Import 语句

    • import 语句应该分行书写
    • import语句应该使用 absolute import
    • import语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前
    • import语句应该按照顺序排列,每组之间用一个空行分隔
    • 导入其他模块的类定义时,可以使用相对导入
    • 如果发生命名冲突,则可使用命名空间
# 正确的写法
import os
import sys # 不推荐的写法
import sys,os # 正确的写法
from subprocess import Popen, PIPE
# 正确的写法
from foo.bar import Bar # 不推荐的写法
from ..bar import Bar
import os
import sys import msgpack
import zmq import foo
from myclass import MyClass
import bar
import foo.bar bar.Bar()
foo.bar.Bar()
  • 空格

    • 在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]
    • 函数的参数列表中,,之后要有空格
    • 函数的参数列表中,默认值等号两边不要添加空格
    • 左括号之后,右括号之前不要加多余的空格
    • 字典对象的左括号之前不要多余的空格
    • 不要为对齐赋值语句而使用的额外空格
# 正确的写法
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b) # 不推荐的写法
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
# 正确的写法
def complex(real, imag):
pass # 不推荐的写法
def complex(real,imag):
pass
# 正确的写法
def complex(real, imag=0.0):
pass # 不推荐的写法
def complex(real, imag = 0.0):
pass
# 正确的写法
spam(ham[1], {eggs: 2}) # 不推荐的写法
spam( ham[1], { eggs : 2 } )
# 正确的写法
dict['key'] = list[index] # 不推荐的写法
dict ['key'] = list [index]
# 正确的写法
x = 1
y = 2
long_variable = 3 # 不推荐的写法
x = 1
y = 2
long_variable = 3
  • 换行

Python 支持括号内的换行。这时有两种情况

  1. 第二行缩进到括号的起始处
foo = long_function_name(var_one, var_two,
var_three, var_four)
  1. 第二行缩进 4 个空格,适用于起始括号就换行的情形
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)

使用反斜杠\换行,二元运算符+ .等应出现在行末;长字符串也可以用此法换行

session.query(MyTable).\
filter_by(id=1).\
one() print 'Hello, '\
'%s %s!' %\
('Harry', 'Potter')

禁止复合语句,即一行中包含多个语句:

# 正确的写法
do_first()
do_second()
do_third() # 不推荐的写法
do_first();do_second();do_third();

if/for/while一定要换行

# 正确的写法
if foo == 'blah':
do_blah_thing() # 不推荐的写法
if foo == 'blah': do_blash_thing()
  • docstring

docstring 的规范中最其本的两点:

  • 所有的公共模块、函数、类、方法,都应该写 docstring 。私有方法不一定需要,但应该在 def 后提供一个块注释来说明。
  • docstring 的结束"""应该独占一行,除非此 docstring 只有一行。
"""Return a foobar
Optional plotz says to frobnicate the bizbaz first.
""" """Oneline docstring"""

注释

块注释

# 块注释
# 块注释
#
# 块注释
# 块注释

行注释

# 正确的写法
x = x + 1 # 边框加粗一个像素 # 不推荐的写法(无意义的注释)
x = x + 1 # x加1

建议

  • 在代码的关键部分(或比较复杂的地方), 能写注释的要尽量写注释
  • 比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性
app = create_app(name, options)

# =====================================
# 请勿在此处添加 get post等app路由行为 !!!
# ===================================== if __name__ == '__main__':
app.run()

文档注释(Docstring)

作为文档的Docstring一般出现在模块头部、函数和类的头部,这样在python中可以通过对象的__doc__对象获取文档. 编辑器和IDE也可以根据Docstring给出自动提示.

文档注释以 """ 开头和结尾, 首行不换行, 如有多行, 末行必需换行, 以下是Google的docstring风格示例

# -*- coding: utf-8 -*-
"""Example docstrings. This module demonstrates documentation as specified by the `Google Python
Style Guide`_. Docstrings may extend over multiple lines. Sections are created
with a section header and a colon followed by a block of indented text. Example:
Examples can be given using either the ``Example`` or ``Examples``
sections. Sections support any reStructuredText formatting, including
literal blocks:: $ python example_google.py Section breaks are created by resuming unindented text. Section breaks
are also implicitly created anytime a new section starts.
"""

不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等

#  不推荐的写法(不要写函数原型等废话)
def function(a, b):
"""function(a, b) -> list"""
... ... # 正确的写法
def function(a, b):
"""计算并返回a到b范围内数据的平均值"""
... ...

对函数参数、返回值等的说明采用numpy标准, 如下所示

def func(arg1, arg2):
"""在这里写函数的一句话总结(如: 计算平均值). 这里是具体描述. 参数
----------
arg1 : int
arg1的具体描述
arg2 : int
arg2的具体描述 返回值
-------
int
返回值的具体描述 参看
--------
otherfunc : 其它关联函数等... 示例
--------
示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行 >>> a=[1,2,3]
>>> print [x + 3 for x in a]
[4, 5, 6]
"""

文档注释不限于中英文, 但不要中英文混用

文档注释不是越长越好, 通常一两句话能把情况说清楚即可

模块、公有类、公有方法, 能写文档注释的, 应该尽量写文档注释

命名规范

模块

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

# 正确的模块名
import decoder
import html_parser # 不推荐的模块名
import Decoder

类名

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

class Farm():
pass class AnimalFarm(Farm):
pass class _PrivateFarm(Farm):
pass

将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.

函数

函数名一律小写,如有多个单词,用下划线隔开

def run():
pass def run_with_env():
pass

私有函数在函数前加一个下划线_

class Person():

    def _private_func():
pass

变量名

变量名尽量小写, 如有多个单词,用下划线隔开

if __name__ == '__main__':
count = 0
school_name = ''

常量

常量采用全大写,如有多个单词,使用下划线隔开

MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600 MAX_OVERFLOW = 100 Class FooBar: def foo_bar(self, print_):
print(print_)

相关参考

草根学Python

Python3 系列之 编程规范篇的更多相关文章

  1. Python3 系列之 基础语法篇

    基础数据类型 整数 python 可以处理任意大小的整数 浮点数 python 可以处理任意大小的浮点数,但是需要注意的一点是:整数运算永远是精确的(除法也是精确的),而浮点数运算则可能会有四舍五入的 ...

  2. Python3 系列之 环境配置篇

    以下所有操作是基于 Windows10 和 Python3.6 来进行的,其它平台和 python 版本请自行百度. 高效使用 Visual Studio Code 系列 环境安装 1.Python ...

  3. .Net程序员学用Oracle系列(3):数据库编程规范

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.书写规范 1.1.大小写风格 1.2.缩进风格 1.3.换行 1.4.其它 2.命名规范 2.1.数据库对象命名 2.2.变 ...

  4. linux shell语言编程规范安全篇之通用原则【转】

    shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...

  5. 【HANA系列】【第二篇】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第二篇]SAP HANA XS ...

  6. [C/C++]编程规范一:头文件篇

    一般来说,每一个.cc或者.cpp文件对应一个头文件(.h文件),当然,也有例外,例如一些测试单元或者main文件,头文件的一些规范可以令代码可读性.程序的性能等大为改观,所以还是要注意头文件的规范问 ...

  7. Batsing的网页编程规范(HTML/CSS/JS/PHP)

    特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...

  8. 使Eclipse符合Java编程规范

    编程规范是很重要的东西,能让团队的代码易于阅读和维护,也便于日后的功能扩展. 工欲善其事必先利其器!作为一个Java程序员,与Eclipse打交道可能是一辈子的事情.将Eclipse设置为符合公司编程 ...

  9. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

随机推荐

  1. java web中的异常处理

    1.集中处理 参考:https://blog.csdn.net/weililansehudiefei/article/details/73691294

  2. 文件描述符fd、文件指针fp和vfork()

    1. fd:在形式上是一个非负整数.实际上他是一个索引值.指向kernal为每一个进程所维护的该进程打开文件的记录表. 当程序打开一个文件或者创建一个新文件的时候kernal向进程返回一个文件描述符. ...

  3. Mybatis关系映射

    一.一对一关系映射 使用resultType+包装类实现 1.假设问题背景是要求在某一个购物平台的后台程序中添加一个这样的功能:查询某个订单的信息和下该订单的用户信息.首先我们可以知道,一般这样的平台 ...

  4. 简单的基于矩阵分解的推荐算法-PMF, NMF

    介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其 ...

  5. 火狐浏览器安装 Modify Headers 插件

    一.火狐浏览器插件安装 这里以火狐浏览器的Modify Headers插件安装为例,展示火狐插件的安装: 1.打开火狐浏览器,右上角选择“附加组件” 2.搜索Modify Headers插件 3.安装 ...

  6. 通过用jQuery写一个页面,我学到了什么

    概述 前几天面试,hr发来一个测试文件,让我做做看.我一看,其实就是根据PSD需求写一个页面,再加上一些互动效果即可. 刚好我之前学了切图,jquery等知识还没练手过,于是高兴的答应了. 最后花了3 ...

  7. 谈谈 JavaScript 的正则表达式

    一.背景 最近在做 CMS 系统中不同身份登录用户的权限管理,涉及到对 api 路径的识别去判断是否放行.以前对正则表达式都是敬而远之,要用到的话都是直接复制粘贴现成网上的表达式,看也看不太懂,借这次 ...

  8. MySQL 线程池&连接池&长连接&短连接

    线程池 简介 1.mysql每连接每线程,mysql都分配一个单独的线程,该线程处理客户端发来的所有命令 2.每个线程会占用一定的系统资源,线程数越多消耗的系统资源也越多 3.线程的创建和销毁有一定的 ...

  9. 转载 Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...

  10. 自定义线程池reject策略

    import java.util.Date;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Rej ...