Python编码规范(GooglePythonStyleGuide)⽬录
分号
⾏长度
括号
缩进
空⾏
空格
Shebang
注释
模块
函数和⽅法
块注释和⾏注释
字符串
⽂件和sockets
TODO注释
导⼊格式
语句
访问控制
命名
Main
Python 风格规范(Google)
本项⽬并⾮ Google 官⽅项⽬, ⽽是由国内程序员凭热情创建和维护。
如果你关注的是 Google 官⽅英⽂版, 请移步
以下代码中 Yes 表⽰推荐,No 表⽰不推荐。
分号
不要在⾏尾加分号, 也不要⽤分号将两条命令放在同⼀⾏。
⾏长度
每⾏不超过80个字符
以下情况除外:
1. 长的导⼊模块语句
2. 注释⾥的URL
不要使⽤反斜杠连接⾏。
Python会将  , 你可以利⽤这个特点. 如果需要, 你可以在表达式外围增加⼀对额外的圆括号。
推荐:
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'):
如果⼀个⽂本字符串在⼀⾏放不下, 可以使⽤圆括号来实现隐式⾏连接:
x = ('这是⼀个⾮常长⾮常长⾮常长⾮常长 '
'⾮常长⾮常长⾮常长⾮常长⾮常长⾮常长的字符串')
在注释中,如果必要,将长的URL放在⼀⾏上。
Yes:
# See details at
# ample/us/developer/documentation/api/content/v2.0/csv_file_name_extension_full_specification.html
No:
# See details at
# ample/us/developer/documentation/api/content/\
# v2.0/csv_file_name_extension_full_specification.html
注意上⾯例⼦中的元素缩进; 你可以在本⽂的 :ref:`缩进 <indentation>`部分到解释.
括号
宁缺⽏滥的使⽤括号
除⾮是⽤于实现⾏连接, 否则不要在返回语句或条件语句中使⽤括号. 不过在元组两边使⽤括号是可以的.
Yes:
if foo:
bar()
while x:
x = bar()
if x and y:
bar()
if not x:
bar()
return foo
for (x, y) in dict.items(): ...
No:
if (x):
bar()
if not(x):
bar()
return (foo)
缩进
⽤4个空格来缩进代码
绝对不要⽤tab, 也不要tab和空格混⽤. 对于⾏连接的情况, 你应该要么垂直对齐换⾏的元素(见 :ref:`⾏长度 <line_length>` 部分的⽰例), 或者使⽤4空格的悬挂式缩进(这时第⼀⾏不应该有参数):
Yes: # 与起始变量对齐
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 字典中与起始值对齐
foo = {
long_dictionary_key: value1 +
value2,
...
}
# 4 个空格缩进,第⼀⾏不需要
foo = long_function_name(
var_one, var_two, var_three,
var_four)
# 字典中 4 个空格缩进
foo = {
long_dictionary_key:
long_dictionary_value,
...
}
No: # 第⼀⾏有空格是禁⽌的
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 2 个空格是禁⽌的
foo = long_function_name(
var_one, var_two, var_three,
var_four)
# 字典中没有处理缩进
foo = {
long_dictionary_key:
long_dictionary_value,
...
}
空⾏
顶级定义之间空两⾏, ⽅法定义之间空⼀⾏
顶级定义之间空两⾏, ⽐如函数或者类定义. ⽅法定义, 类定义与第⼀个⽅法之间, 都应该空⼀⾏. 函数或⽅法中, 某些地⽅要是你觉得合适, 就空⼀⾏.
空格
按照标准的排版规范来使⽤标点两边的空格
括号内不要有空格.
按照标准的排版规范来使⽤标点两边的空格
Yes: spam(ham[1], {eggs: 2}, [])
No: spam( ham[ 1 ], { eggs: 2 }, [ ] )
不要在逗号, 分号, 冒号前⾯加空格, 但应该在它们后⾯加(除了在⾏尾).
Yes: if x == 4:
print x, y
x, y = y, x
No: if x == 4 :
print x , y
x , y = y , x
参数列表, 索引或切⽚的左括号前不应加空格.
Yes: spam(1)
no: spam (1)
Yes: dict['key'] = list[index]
No: dict ['key'] = list [index]
在⼆元操作符两边都加上⼀个空格, ⽐如赋值(=), ⽐较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not). ⾄于算术操作符两边的空格该如何使⽤, 需要你⾃⼰好好判断. 不过两侧务必要保持⼀致.
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)
不要⽤空格来垂直对齐多⾏间的标记, 因为这会成为维护的负担(适⽤于:, #, =等):
Yes:
foo = 1000 # 注释
long_name = 2 # 注释不需要对齐
dictionary = {
"foo": 1,
"long_name": 2,
}
No:
foo  = 1000 # 注释
long_name = 2  # 注释不需要对齐
dictionary = {
"foo"  : 1,
"long_name": 2,
}
Shebang
⼤部分.py⽂件不必以#!作为⽂件的开始. 根据PEP-394 , 程序的main⽂件应该以 #!/usr/bin/python2或者 #!/usr/bin/python3开始.
python官方文档中文版(译者注: 在计算机科学中, Shebang (也称为Hashbang)是⼀个由井号和叹号构成的字符串⾏(#!), 其出现在⽂本⽂件的第⼀⾏的前两个字符. 在⽂件中存在Shebang的情况下, 类Unix操作系统的程序载⼊器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调⽤该指令, 并将载有Shebang的⽂件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的⽂件在执⾏时会实际调
⽤/bin/sh程序.)
#!先⽤于帮助内核到Python解释器, 但是在导⼊模块时, 将会被忽略. 因此只有被直接执⾏的⽂件中才有必要加⼊#!.
注释
确保对模块, 函数, ⽅法和⾏内注释使⽤正确的风格
⽂档字符串
Python有⼀种独⼀⽆⼆的的注释⽅式: 使⽤⽂档字符串. ⽂档字符串是包, 模块, 类或函数⾥的第⼀个语句. 这些字符串可以通过对象的__doc__成员被⾃动提取, 并且被pydoc所⽤. (你可以在你的模块上运⾏pydoc试⼀把, 看看它长
什么样). 我们对⽂档字符串的惯例是使⽤三重双引号"""( PEP-257 ). ⼀个⽂档字符串应该这样组织: ⾸先是⼀⾏以
句号, 问号或惊叹号结尾的概述(或者该⽂档字符串单纯只有⼀⾏). 接着是⼀个空⾏. 接着是⽂档字符串剩下的部分,
它应该与⽂档字符串的第⼀⾏的第⼀个引号对齐. 下⾯有更多⽂档字符串的格式化规范.
模块
每个⽂件应该包含⼀个许可样板. 根据项⽬使⽤的许可(例如, Apache 2.0, BSD, LGPL, GPL), 选择合适的样板.
函数和⽅法
下⽂所指的函数,包括函数, ⽅法, 以及⽣成器.
⼀个函数必须要有⽂档字符串, 除⾮它满⾜以下条件:
1、外部不可见
2、⾮常短⼩
3、简单明了
⽂档字符串应该包含函数做什么, 以及输⼊和输出的详细描述. 通常, 不应该描述"怎么做", 除⾮是⼀些复杂的算法. ⽂档字符串应该提供⾜够的信息, 当别⼈编写代码调⽤该函数时, 他不需要看⼀⾏代码, 只要看⽂档字符串就可以了. 对于复杂的代码, 在代码旁边加注释会⽐使⽤⽂档字符串更有意义.
关于函数的⼏个⽅⾯应该在特定的⼩节中进⾏描述记录,这⼏个⽅⾯如下⽂所述. 每节应该以⼀个标题⾏开始. 标题⾏以冒号结尾. 除标题⾏外, 节的其他内容应被缩进2个空格.
Args:
列出每个参数的名字, 并在名字后使⽤⼀个冒号和⼀个空格, 分隔对该参数的描述.如果描述太长超过了单⾏80字符,使⽤2或者4个空格的悬挂缩进(与⽂件其他部分保持⼀致). 描述应该包括所需的类型和含义. 如果⼀个函数接受*foo(可变长度参数列表)或者**bar (任意关键字参数), 应该详细列出*foo和**bar.
Returns: (或者 Yields: ⽤于⽣成器)
描述返回值的类型和语义. 如果函数返回None, 这⼀部分可以省略.
Raises:
列出与接⼝有关的所有异常.
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable.
Retrieves rows pertaining to the given keys from the Table instance
represented by big_table. Silly things may happen if
other_silly_variable is not None.
Args:
big_table: An open Bigtable Table instance.
keys: A sequence of strings representing the key of each table row
to fetch.
other_silly_variable: Another optional variable, that has a much
longer name than the other args, and which does nothing.
Returns:
A dict mapping keys to the corresponding table row data
fetched. Each row is represented as a tuple of strings. For
example:
{'Serak': ('Rigel VII', 'Preparer'),
'Zim': ('Irk', 'Invader'),
'Lrrr': ('Omicron Persei 8', 'Emperor')}
If a key from the keys argument is missing from the dictionary,
then that row was not found in the table.
Raises:
IOError: An error occurred accessing the bigtable.Table object.
"""
pass
类应该在其定义下有⼀个⽤于描述该类的⽂档字符串. 如果你的类有公共属性(Attributes), 那么⽂档中应该有⼀个属性(Attributes)段. 并且应该遵守和函数参数相同的格式.
class SampleClass(object):
"""Summary of class here.
Longer
Longer
Attributes:
likes_spam: A boolean indicating if we like SPAM or not.
eggs: An integer count of the eggs we have laid.
"""
def __init__(self, likes_spam=False):
"""Inits SampleClass with blah."""
self.likes_spam = likes_spam
def public_method(self):
"""Performs operation blah."""
块注释和⾏注释
最需要写注释的是代码中那些技巧性的部分. 如果你在下次代码审查的时候必须解释⼀下, 那么你应该
现在就给它写注释. 对于复杂的操作, 应该在其操作开始前写上若⼲⾏注释. 对于不是⼀⽬了然的代码, 应在其⾏尾添加注释.
# We use a weighted dictionary search to find out where i is in
# the array. We extrapolate position based on the largest num
# in the array and the array size and then do binary search to
# get the exact number.
if i & (i-1) == 0:  # true iff i is a power of 2
为了提⾼可读性, 注释应该⾄少离开代码2个空格.
另⼀⽅⾯, 绝不要描述代码. 假设阅读代码的⼈⽐你更懂Python, 他只是不知道你的代码要做什么.
# BAD COMMENT: Now go through the b array and make sure whenever i occurs
# the next element is i+1
如果⼀个类不继承⾃其它类, 就显式的从object继承. 嵌套类也⼀样.
Yes: class SampleClass(object):
pass
class OuterClass(object):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。