python风格规范_Python学习笔记(2)Python风格规范

Python风格规范学习,原文链接http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/

分号

不要在行末尾加分号,也不要用分号将两条命令放在一行。

行长度

每行不要超过80个字符。

例外:

长的导入模块语句

注释里的URL

不要使用反斜杠来连接行

如:

s = 'hello ' \

'world'

Python会将圆括号,中括号和花括号中的行隐式连接,可以在表达式外增加一对额外的圆括号。

原:

x = 'This will build a very long long long long long string'

if width == 0 and height == 0 and color == 'red' and emphasis == 'strong':

print(x)

换行后:

x = ('This will build a very long '

'long long long long string')

if (width == 0 and height == 0 and

color == 'red' and emphasis == 'strong'):

print(x)

在注释里,如果有必要,将长的url放在一行上。

例如:

#HTML教程

#http://www.runoob.com/html/html-tutorial.html

括号

除非是用于实现行连接,否则不要在返回语句中或者条件语句中使用括号,不过在元组两边使用括号是可以的。

缩进

使用四个空格来缩进代码。不要使用tab或者tab和括号混用。

对于行连接的情况,要么垂直对齐行元素,或者使用4空格的悬挂式缩进。

空行

顶级定义之间空两行,比如函数或者类定义;类定义与第一个方法之间,都应该空一行。方法之间空一行。

空格

括号内不要有空格。

不要在逗号,分号,冒号前面使用空格,但应该在它们后面加空格(除了在行尾)。

参数列表、索引或切片的左括号前不应该加空格。

在二元操作符两边都加上一个空格,比如赋值(=), 比较 (==, <, >, !=, <>, <=, >=, in, not in, is, is not)

布尔(and, or, not)。

当 '='用于指示关键字参数或者默认值参数时,不要在其两侧使用空格。

不要使用空格垂直对齐多行间的标记。

注释

确保对模块,函数,方法和行内注释使用正确的风格。

Python有一种独一无二的注释方式:使用文档字符串。文档字符串是包,模块,类或函数里第一个语句。这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc所用。

文档字符串的惯例是使用三种双引号“”“,一个文档字符串应该这样组织:

1.首先是一行以句号,问号或者惊叹号结尾的概述(或者该文档字符串单纯只有一行)

2.接着是一个空行

3.接着是文档字符串的剩下的部分,它应该与文档字符串的第一行的第一个引号对齐。

模块 每个文件都应该是一个许可样板。使用项目使用的许可,选择合适的样板。

函数和方法 下文所指的函数,包括函数、方法以及生成器。一个函数必须要有文档字符串,除非它满足以下的条件:

1.外部不可见 2.非常短小 3.简单明了

文档字符串应该包含函数做什么,以及输入和输出的详细描述。通常,不应该描述”怎么做“,除非是一些复杂的算法。

文档字符串应该提供足够的信息,当别人编写代码调用该函数时,不需要看一行代码,只要看文档字符串就行了。对于复杂的代码,在代码旁边加上注释会比使用文档字符串更有意义。

关于函数的几个方面应该在特定的小节中进行描述:每节应该以一个标题行开始,标题以冒号结尾,除标题行外,节的其它内容应被缩进两个空格。

Args:列出每个参数的名字,并在名字后使用一个冒号和空格,分割对该参数的描述。如果描述太长超过了单行80字符,使用能够2或者4个空格的悬挂缩进(与文件其它部分保持一致)。描述应该包括所需的类型和定义。如果一个函数接受*foo(可变长度参列表)或者**bar(任意关键字参数),应该详细列出*foo和**bar。

Returns:(或者Yields:用于生成器)描述返回值的类型和语义, 如果函数返回None,这一部分可以省略。

Raises:列出与借口相关的所有异常。

类类应该在其定义下有一个用于描述该类的文档字符串,如果类有公共属性(Attributes),那么文档中应该有一个属性(Attributes)段。并且应该遵守和函数参数相同的格式。

块注释和行注释

最需要写注释的是代码中那些技巧性的部分。如果你在下次代码审查的时候必须解释以下,那么你应该现在就给它写注释。对于复杂的操作,应该在其操作开始前写上若干行注释。对于不是一目了然的代码,应该在其行尾添加注释。

为了提高可读性,注释应该至少离开代码两个空格。另一方面,绝不要描述代码,假设阅读代码的人比你更懂Python,他只是不知道你的代码要做什么。

类:

如果一个类不继承其它类,就显式的从object继承,嵌套类也是一样。

继承object是为了使属性(properties)正常工作,并且这样可以保护你写的代码,使其不受PEP-3000的一个特殊的潜在不兼容的影响。这样做也定义了一些特殊方法,这些方法实现了对象的默认语意,包括

__new__,__init__,__delattr__,__getattr__,__setattr__,__hash__,__repr__,__str__

字符串

即使参数都是字符串,使用%s操作符或者格式化方法格式化字符串。在+和%之间做好判断。

x = a + b

x = '%s, %s' % (imperative, expletive)

x = '{}.{}!'.format(imperative, expletive)

x = 'name: %s; score: %d' % (name, n)

x = 'name: {}; score:{}'.format(name, n)

避免在循环中用+和+=操作符来累加字符串,由于字符串是不可变的,这样做会创建不必要的临时对象,并且导致二次方而不是线性的运行时间。作为代替方案,可以将每个字符串都加入列表,然后在循环结束后用.join连接列表。

在同一个文件中,保持使用字符串引号的一致性。使用单引号或者双引号之一用以引用字符串,并且在同一个文件中沿用。在字符串内可以使用另一种引号,以避免在字符串中使用。

为多行字符串使用三种双引号”“”而非三重单引号‘’‘,并且仅当项目中使用单引号’来引用字符串时,才可能会使用三重‘’‘为文档字符串的多行字符串来标识引用,文档字符串必须使用三种双引号"""。不过要注意,通常隐式行连接更清晰,因为多行字符串与程序其它部分的缩进方式不一致。

文件和sockets

在文档和sockets结束时,显式的关闭它。

除文件外,sockets或其它类似文件的对象在没有必要的时候打开会有许多副作用,例如:

1.它们可能会消耗有限的系统资源,如文件描述符。如果这些资源在使用后没有及时归还系统,那么用于处理这些对象的代码会将资源消耗殆尽。

2.持有文件将会组织对于文件的其它操作,诸如移动、删除之类的操作。

3.仅仅从逻辑上关闭文件和sockets,那么它们仍然可能会被其共享的程序在无意中进行读或者写操作。只有当它们真正被关闭后,对于它们尝试进行读或者写操作将会被抛出异常,并使得问题快速

显现出来。

而且,幻想当文件析构时,文件和sockets会自动关闭,试图将文件对象的生命周期和文件的状态绑定在一起的想法,都是不现实的,因为有如下几个原因:

1.没有任何方法可以确保运行环境会执行文件的析构。不同Python实现采用不同的内存管理技术,比如延时垃圾处理机制,演示垃圾处理机制可能会导致对象生命周期被任意无限延长。

2.对于文件的意外引用,会导致对于文件的持有时间超出预期(比如对于异常的跟踪,包含有全局变量等)

推荐使用"with"语句来管理文件。

对于不支持使用“with”语句的类似文件的对象,使用contextlib.closing()。

import contextlib

with context.closing(urlli.urlopen('http://www.baidu.com')) as front_age:

for line in front_page:

print line

为临时代码使用TODO注释,它是一种短期解决方案。

TODO注释应该在所有开头包含“TODO”字符串,紧跟着使用括号括起来你的名字,email地址或其它标识符,然后是一个可选的冒号,接着必须有一行注释,解释要做什么,主要目的是为了有一个

统一的TODO格式,这样添加注释的人就可以搜索到。写TODO注释并不保证写的人会亲自解决问题。当你写了一个TODO,请注明你的名字。

导入格式

import os

import sys

导入总应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前,导入应该按照从最通用到最不通用的顺序分组。

每组分组中,应该可以根据每个模块的完整包路径按字典顺序,忽略大小写。

语句

通常每个语句应该独占一行。

如果测试结果与测试语句在一行放得下,你也可以将它们放在同一行中。如果是if语句,只有在没有else时才能这样做,特比的,绝对不要对try/except这样做,因为try和except不能放在同一行。

访问控制

在Python中,对于琐碎又不太重要的访问函数,你应该直接使用共有变量来去取代它们,这样可以避免额外的函数调用的开销,当添加更多功能时,你可以使用(property)来保持语法的一致性。

命名

应该避免的名称:

1.单字符的名称,除了计数器和迭代器。

2.包、模块名中的连接字符串(-)。

3。双下划线开头并结尾的名称。

命名约定

1.所谓“内部(Internal)”表示仅模块内可用,或者,在类内是保护或私有的。

2.用单下划线(_)开头表示模块变量或者函数是protected的(使用import * from)时不包含。

3.用双下划线(__)开头的实例变量或者方法表示类内私有。

4.将相关的类和顶级域名放在同一个模块里。

5.对类名使用大写字母开头的单词,但是模块名应该使用小写加下划线的方式。

Main

主功能应该放在一个main()函数中。

在Python中,pydoc以及测试单元要求模块必须是可导入的。代码应该在执行主程序前总是检查if __name__ == '__main__',这样当模块被导入时主程序就不会被执行。

def main():

pass

if __name__ == '__main__':

main()

所有的顶级代码在模块导入时都会被执行,不要去调用函数,创建对象,或者执行那些不应该在pydoc时执行的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值