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 行的最大长度

  • 类似于函数中的注释、函数体等,如果某一行很长,则导致换行折叠观看,很影响美观,而且还不利于阅读,因此,对顺序排放的大块文本(文档字符串或注释),推荐长度限制在72个字节以内,推荐用反斜杠续行

3.4 空行

  • 用两行分割顶层函数和类的定义。
  • 用一行分割类成员方法的定义。
  • 在一个函数内使用空行时请注意谨慎使用用于一个逻辑段

3.5编码

编码的两种格式:

在python2.4之后内核已经开始支持Unicode了。

在什么情况下:使用“utf-8”才是王道

# coding=utf-8# -*- coding:utf-8 -*-

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)紧挨着圆括号,方括号和花括号的

“spam( ham[ 1 ], { eggs : 2 })”修改后“spam(ham[1],{eggs: 2})”

2.紧贴在逗号,分号或者冒号前的

如:“if x = 4 : print x , y ; x , y = x , y”修改后

3.紧贴在函数调用的参数列表前开式括号的

4紧贴在索引或切片下标开始的开括号前

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
x = x * 2 - 1
c=(a+b)*(a-b)
c = (a+b) * (a-b)

不要在用于指定关键字参数或默认参数值得“=”号周围使用空格,例如:

1.def complex(real, image=0.0):
2.    return magice(r=real,i=image)   

不要将多条语句写在同一行上

No:  if foo == 'blah':do_blah_thing()
Yes: if foo == 'blan':
     	do_blan_thing()
No:  do_one();do_two();do_three()
Yes: do_one()
     do_two()
     do_three()

6.注释

  • 注释必须跟代码保持一致,如果想修改代码时,建议先修改注释,注释必须是一个完整的句子
  • 如果注释是一个句子或者短语,请首字母大写
  • 如果注释很短,建议省略句末句号
  • 注释通常由一个或多个由完整句子构成的段路组成,每个句子应该以句号结尾
  • 注释请使用英文
  • 约定使用统一的文档化注释格式有助于良好的习惯和团队进步

6.1注释快

  • 注释快通常应用于跟随者一些(或者全部)代码并和这些代码有着相同的缩进层次。
  • 注释块中每行以“#”和一个空格开始(除非他是注释内的缩进文本)
  • 注释块内的段落以仅单个“#”的行分割
  • 注释块上下方最好有一行包围(或上下两行下方一行,对一个新函数定义段的注释)

6.2行内注释

行内注释应该至少两个或者两个以上和语句分开,它们应该以“#”和单个空格开始

x = x+1    # Increment x

如果语义是很明白的,那么行内注释是不必要的,事实上是应该被去掉的,不要这样子写

x = x+1  Increment x

8.版本注释

1._Version_="$Revision: 1.0.0.0$"
1 '''

2 @version: 1.0.0.0

3 '''

其他相关信息(如author、copyright、date等)一起。

9.命名约定

  • 现在的命名比较混乱,尽量跟着内部一致

9.1描述:命名风格

  • 单下划线作为前导的,如:single_begin,这是弱的内部使用的标识,例如使用“from 模块名 import *”的时候不会被导入;
  • 单下划线作为结尾的,如:single_end_,这一般用于避免跟python关键字起冲突;
  • 双下划线前导,如:_double_begin ,类私有名;
  • 双下划线前导+结尾,如:__ double_begin_and_end__,特殊对象或属性,存在于用户控制的命名空间中,如: _ _init _ _, _import _等,有时可以被用户定义,用于触发某个特殊行为,如运算符重载。

9.2命名规定

9.2.1,应避免的名字

永远不要用:

  • 小写字母“l”(大写的L)
  • 大写字母“O”
  • 大写字母“I”(读音eye,大写的 ’I‘)

作为单字符的变量名,因为不利于跟数字“0”和“1”很好的区分开来

当要用小写字母“l”时,请用大写的“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得到访问权。通常,双前导下划线应该只用来避免与类中的属性发生名字冲突

9.2.8继承

pass

10.设计建设

  • 1.与像None之类的单值进行比较的时候,应永远使用:is’或’is not’
    当你的本意是"if x is not None"时,对写成"if x"要小心,因为例如当你测试一个默认为None的变量或参数是否被设置为其他值时,这个其他值可能是-个在布尔上下文中为假的值

  • 2.基于类的异常总是好过基于字符串的异常
    模块和包应该定义它们自己的域内特定的基异常类,基类应该是内建的Exception类的子类不始终包含一 个类的文档字符串。例如:

    1class MessageError(Exception):
    2    """"Base class for errors 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和变 量混合连接使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值