Python
1介绍
1.1开发背景
为了提高组内自动化开发效率,避免重复开发,对组内各个模块已开发的自动化lib库、case中常用的操作、以及其他工具的调用接口进行汇总,管理出dsqa组内自动化case开发的基础库。
1.2语言
基础库采用python开发,需要调用的相关二进制工具的地方,为降低开发成本,暂采用直接调该工具,封出python方法接口。
1.3规范文档
为了方便维护,他人阅读使用,整理出该编码规范文档,请大家开发时遵循本规范进行更开发。
本文档参考Guido的(python风格指南)一文,并从(Barry's style guide)中添加了部分内容,以及我的个人建议
2. 一次性建议
整个项目的开发中请尽量保持一致性尤其是伊戈尔某块或一个函数中的一致性更为重要。
因此存在这样的问题由于不同模块的lib库开发人不同,编码规范也可能不同,整合起来会显的不够“和谐”,还是希望个模块lib库负责人做相应的修改,尽量“和谐”
3.代码的布局
3.1 缩进
众所周知,python是通过缩进来进行代码布局的,使用vi可以在~/.vimrc中配置几个空格代表一个tab,从未两布局python函数的缩进
3.2 Tab还是空格
python里有一句"以用空格为荣,以用tab键为耻。“。但全用空格时确池。这里不限定用tab键还是空格,但记住,不可混用!
你可以选择全部使用tab键,这样也不会出错。
3.3 行的最大长度
类似于函数中的行注释。函数体等。如果某一行很长,则导致换行折叠观看,很影响美观,而且还不利于阅读,因此,对顺序排放的大块文本I(文档字符串或注释)。用、推荐长度限制72个字符。
推荐使用反射杠续行。
3.4 空行
用两行分割顶层函数和类的定义
用一行分割类成员方法的定义
在一个函数内使用空行时请注意谨慎使用于一个逻辑段
3.5 编码
在python 2.4之后内核已经开始支持Unicode了。
无论什么情况下,使用UTF-8才是王道
1.#-*-coding:utf-8-*-
2""" """
4.导入
通常应该在单独行中使用导入。
例如:
No: import sys,os
Yes import sys
import os
但是这样也是可以的:
from types import StringType,ListType
import应该放在文件的顶部,仅在模块注释和文档字符串之后,在模块的全局变量和常量之和。
Import 也是有顺序的:
1)Python标准库的import;
2)第三方的import
3)自定义的库的库import
并且使在每组的import之间用一行空行分割。
5.空格
以下地方不推荐出现空格
1)紧挨着圆括号,方括号和花括号的n
如:"spam(ham[1],{eggs:2})"写成:"spam(ham[1], {eggs: 2})"
2)紧贴在逗号,分好或冒号前的
如:”if x==4:printx,y;x,y".写成"if x == 4: print x,y; x,y = y, x".
3)紧贴着函数调用的参数列表前开式括号的
如:"dict['key']=list['index']"写成"dict['key'] = list['index']"
4)紧贴在索引或切片下标开始的开式括号前
如:"dict['key']=list['index']"写成"dict['key'] = list['index']"
5)在赋值(或其他)运算符周围的用于和其他并排的一个以上的空格,如:
1 x =1
2 y =2
3 long_variable =3
写成
1 x=1
2 y=2
3 long_variable=3
5.1 其他建议
始终在这些二元运算符两边放置一个空格;赋值(=),比较(==,<,>,!=,<>,<=,>=,in, not in,is ,is not),布尔运算(and,or,not)
按你的看法在算术运算符周围插入空格,始终保持二元运算符两边空格一致
i = i + 1
b = b + 1
x = x * 2-1
不要将多条语句写在同一行上。
if foo == 'blan': do_blah_thing()
if foo == 'blan':
do_blan_thing()
No: do_one();do_two();do_three()
Yes:do_one()
do_two()
do_three()
不要在用于指定关键字参数或默认参数值的‘=’号周围使用空格,例如:
1.del complex(real,imag=0.0)
2. return magic(r=real,i=imag)
6.注释
注释必须跟代码保持一致,当你想修改代码时,建议优先修改注释
注释必须是完整的句子
如果注释是一个句子或者短语,请首字母大写
如果注释很短,建议省略句末的句号
注释通常由一个或多个由完整句子构成的段落组成,每个句子应该以句号结尾
注释请使用英文
约定使用统一的文档化注释格式有助于良好的习惯和团队进步
6.1注释块
注释块通常应用于跟随着一些(或者全部)代码并和这些代码有着相同的缩进层次。
注释块中每行以'#'和一个空格开始(除非他是注释内的缩进文本)
注释块内的段落以仅含单个'#'的行分割
注释块上下放最好有一空行包圈(或上下两行下方一行,对一个新函数的定义段的注释)
6.2行内注释
行内注释应该至少用两个空格和语句分开,它们应该以’#'和单个空格隔开
x=x+1 #increnent x
如果语意是很明了的,那么行内注释是不必要的,事实上是应该被去掉的,不要这样写
x=x+1 #increnent x
8.版本注释
1 _version_="SRevision1.0.0.0$"
这个行应该包含在模块的文档字符串之后,所有代码之前上下用一个空行分割
当然也可以这样:
1 '''
2 @version: 1.0.0.0
3 '''
跟其他相关信息(如author,copyright,date等)一起
9.命名约定
现有的库命名约定相比比较混乱,但对于今后即将开发的新的模块尽量遵循该约定开发,对于已有的模块存在不同风格的,保证内部的一致性是首选的。
9.1. 描述:命名风格
1)单下划线作为前导,如:_single_begin,这是弱的内部使用标识,例如使用"from M import *"的时候不会被导入;
2)单下划线作为结尾的,如:single_end_,这一般用于个Python关键词冲突;
3)双下划线前导,如:_ _double_ _begin, 类私有名;
4)双下划线前导+结尾,如: _double_ begin_ and_ end_ , 特殊对象或属性,存在于用户控
制的命名空间中,如:_ init__ ,_ import_ 等。 有时可以被用户定义,用于触发某个特殊行为,如运算符重载。
9.2 说明:命名约定
9.2.1 应避免的名字
永远不要用:
1)小写字母“l”(小写的“L”);
2)大写字母“O”;
3)大写字母“I”(eye)
作为单个字符的变量名,因为不利于跟数字“0”和“1”很难分开来。
当要用于小写字母“i”请用大写字母“L”代替
9.2.2 模块名
模块应该是不含下划线,简短的,小写的名字
因为有些模块名被映射到文件名,有些文件系统大小写不敏感并且截短长名字,模块名被选为相当短是重要的--这在Unix上不上问题,但代码传到Mac或者Windows上可能是个问题
9.2.3 类
几乎没有例外,类名总是使用首字母大写,驼峰命名单词串的约定
9.2.4 异常名
首字母大写,驼峰命名
9.2.5 全局变量名
这个约定跟用于函数的约定差不多
那些模块,应该在那些不想被导入的全局变量(还有内部函数和类)前面加一个下划线
9.2.6 函数名
函数名应该为小写,动病短语,可能用下划线风格单词以增加可读性。如:open_file()
9.2.7 方法名和实例的变量名
小写,动病短语、下划线风格以增加可读性
单前导下划线仅用于不打算作为类的公共接口的内部方法
双前下划线表示类私有的名字,python将这些名字和类名连接在一起。
如果累Foo有一个属性名为_a,它不能以Foo.\\\_a访问,如果你非要访问,还是可以通过Foo\_foo.\\\_a得到访问权,通常,双前导下划线应该只用来避免与类与类中的属性发生名字冲突
`
# 10.设计建议
```python
1.与像None之类的单值进行比较的时候,应永远使用:is'或'is not'
当你的本意是"if x is not None"时,对写成"if x"要小心,因为例如当你测试一个默认为None的变量或参数是否被设置为其他值时,这个其他值可能是-个在布尔上下文中为假的值
2.基于类的异常总是好过基于字符串的异常
模块和包应该定义它们自己的域内特定的基异常类,吉磊应该是内建的Exception类的子类不始终包含一 个类的文档字符串,例如:
1class MessageErro(Exception):
2 """Base class for in the email package."""
3.使用字符串方法代替字符串模块
因为字符串方法总是非常的快
4.在检查前缀或后缀时避免对字符串进行片
用startswith()和endswith()代替,因为它们是明确的并且错误更少
No: if foo[:3]=='bar'
Yes: if foo.startswith("bar")
5.对象类型的比较始终用isinstance()代替直接比较类型
NO: if type(obj)is type(1):
Yes: if isinstance(obj, int):
6.检查一个对象 是否是字符串时,紧记它也可能是unicode字符串
7.对序列,(字符串,列表,元组),使用空列表是false这个事实,因此"if not seq" 比"if len(seq)" 或"if not len(seq)"好
8.书写字符串文字时不要依赖于有意义的后置空格,这种后置空格在视觉上不可辨认的
9.No Chinese!包括注释,也请尽量使用英文
10.,自动化case中请使用python logging模块设定日志级别打印日志,而不要大量使用print()输出
11.print()时请使用"%d","%s "等标准输出格式,请勿str和变 量混合连接使用