本文摘要
python风格规范:
分号,行长度,括号,缩进,空行,空格,Shebang,注释,类,字符串
内容一 风格规范
分号
不在行尾加分号,不用分号将两条命令放在同一行
行长度
每行不超过80个字符(当导入模块语句和注释里的url长度超过时候例外) 不使用反斜杠连接行 python会将(),[],{},的行隐式的连接起来,如果需要可以在表达式的外围增加一对额外的圆括号 如果一个文本字符串在一行放不下,可以使用圆括号实现隐式行连接 在注释中,如果必要,将长的rul放在一行上
举例:
foo_bar(self, width, height, color='black',
design=None, x='foo',emphasis=None,
highlight=0)
if (width == 0 and height == 0 and color == 'red' and
emphasis == 'strong'):
括号
宁缺勿滥的使用括号 除非是用于实现行连接,否则不要在返回语句或者条件语句中使用括号 在元组两边使用括号是可以的 for (x,y) in dict.items(): ...
缩进,空行
用四个空格来缩进代码 顶级定义之间空两行,比如函数或者类定义 方法定义/类定义与上一个方法/类之间空一行 函数或者方法中,某些地方觉得合适,也可以空一行
空格
按照标准的排版规范来使用标点两边的空格 括号内不要存在空格 不要在括号分号冒号前面加上空格,但是应该在分号,逗号,冒号后面加上空格(行尾除外) 参数列表,索引或者切片的左括号前面不加空格 在二元操作符两边都加上一个空格,至于算术操作符两边的空格根据自己判断,保持两侧一致 当=用于指示关键字参数或者默认参数的时候,不要在其两侧使用空格 不要用空格来垂直对齐多行件的标记,因为这样会成为维护的负担
举例:
Yes: spam(ham[1], {eggs: 2}, [])
No: spam( ham[ 1 ], { eggs: 2 }, [ ] )
Yes: spam(1)
no: spam (1)
Yes: dict['key'] = list[index]
No: dict ['key'] = list [index]
Yes: x == 1
No: x<1
Yes: def complex(real, imag=0.0): return magic(r=real, i=imag)
No: def complex(real, imag = 0.0): return magic(r = real, i = imag)
Shebang
大部分的.py文件都不需要以#!为文件的开始 根据pep-394(python enhancement proposals)Python增强建议书, 程序的main文件应该以#!/usr/bin/python2 或者#!/usr/bin/python3开始#!先用于帮助内核找到python解释器,但是在导入模块时候,将会被忽略 只有在直接被执行的文件中才有必要加入#!
备注
在计算机科学中, Shebang(也称为Hashbang)是一个由井号和叹号构成的字符串>行(#!), 其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下, 类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令, 并将载有Shebang的文件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序.
注释
确保对模块,函数,方法,行内注释使用正确的风格 文档字符串:文档字符串是python的一种独一无二的注释方式,文档字符串是包,模块,类或者函数里的第一个语句,这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc所用,对文档字符串使用三重双引号,第一行以句号问号惊叹号结尾的概述(或者文档字符串可以只有一行),接着是一个空行,最后是文档字符串的剩下的部分 模块:每个文件应该包含一个许可样板,根据项目使用的许可(比如:apache2.0,bsd等),选择合适的样板 函数和方法:一个函数必须要有文档字符串,除非它(外部不可见,非常短小,简单明了) 文档字符串包含:函数做什么,输入和输出的详细描述,通常,不应该描述怎么做,除非是一些复杂的算法,文档字符串提供足够的信息,当别人编写代码调用该函数时候,不需要看代码,只要看文档字符串就可以,对于复杂的代码,在代码的旁边加注释会比使用文档字符串更加有意义 关于函数的几个方面应该在特定的小节中进行描述记录, 这几个方面如下文所述. 每节应该以一个标题行开始. 标题行以冒号结尾. 除标题行外, 节的其他内容应被缩进2个空格 Args: 列出每个参数的名字, 并在名字后使用一个冒号和一个空格, 分隔对该参数的描述.如果描述太长超过了单行80字符,使用2或者4个空格的悬挂缩进(与文件其他部分保持一致). 描述应该包括所需的类型和含义. 如果一个函数接受*foo(可变长度参数列表)或者**bar (任意关键字参数), 应该详细列出*foo和**bar. Returns: (或者 Yields: 用于生成器) 描述返回值的类型和语义. 如果函数返回None, 这一部分可以省略. Raises: 列出与接口有关的所有异常.
实例:
类:类应该在其定义下有一个用于描述该类的文档字符串,如果类有公共属性attributes,文档中应该有一个属性段,并且遵守和函数相同的格式
块注释和行注释:最需要写注释的是代码中有技巧性的部分, 如果在代码审查的时候必须解释一下,则应该现在就给它写注释, 对于复杂的操作,应该在操作之前写上注释, 对于不是一目了然的代码,应该在行尾加上注释 为了提高可读性,注释应该至少离开代码2个空格 不要描述代码,阅读代码的人有可能比你更懂python
类
如果一个类不继承自其他类,就显示的从object继承,嵌套类也一样 继承自object是为了使得属性properties正常工作,并且可以保护代码, 使不受python3000的一个特殊的潜在不兼容性影响 继承自object类,定义了一些特殊的方法,实现了对象的默认语义: __new__,__init__,__delattr__,__getattribute__,__setattr__,__hash__,__repr__,__str__
实例:
class SampleClass(object):
pass
class OuterClass(object):
class InnerClass(object):
pass
class ChildClass(ParentClass):
"""Explicitly inherits from another class already."""
字符串
即使参数都是字符串,使用%操作符或者格式化方法格式化字符串 避免在循环中使用+和+=累加字符串,这样做会创建不必要的临时对象,并且导致二次方而不是线性的运行实际那, 可以将每个子串加入列表,然后在循环结束后用.join连接列表 也可以将每个子串写入到一个cStringIO.StringIO缓存中 在同一个文件中,保持使用字符串引号的一致性 为多行字符串使用三重双引号”“”而非三重单引号’‘’
引用
1 Google开源项目风格指南