设为首页 收藏本站
查看: 863|回复: 0

[经验分享] Google的python编程规范

[复制链接]

尚未签到

发表于 2017-4-29 07:43:39 | 显示全部楼层 |阅读模式
完整的规范文档在这里:http://google-styleguide.googlecode.com/svn/trunk/pyguide.html。




这里总结那些个人认为比较重要或者对避免采坑注意事项。




Imports




仅仅使用import导入包和模块。


  • import x,导入包和模块
  • from x import y,导入包下面的模块,这里x为包,y为没有前缀的模块
  • from x import y as z,如果两个模块的名为y,或者模块y的名字太长



例如,可以这样导入包sound.effects.echo




from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4) 





这样做的好处是命名空间的管理规范很简单,每一个标识符的使用也是一致的。例如x.Obj表明对象Obj定义在模块x中。切勿在imports中使用相对名称。虽然模块在同一个包里,也要使用包的全路径名称。




Exceptions




异常可以被使用,但要小心使用。使用异常必须遵循下面的条件:


  • 应该这样抛出异常:raise MyException("Error Message") 或者 raise MyException。不要使用这样的形式:raise MyException "Error Message" 或者 raise "Error Message"。
  • 模块或包应该定义自己业务相关的异常基类。基类应该继承Exception,并且应该定义成Error:



class Error(Exception):
pass


  • 永远都不要使用捕捉所有异常的语句except:或者捕捉Exception或StandardError,除非你将重新抛出异常,或者记录这些异常的信息。except:会捕捉所有的错误,包括语法错误。使用except:很容易隐藏真正的bug。
  • 尽量减少try/except代码块的代码量。越多的代码意味着抛出异常的概率也越大,往往会在你不期待的代码中抛出异常,这种情况下,try/except会掩盖真正的错误。
  • 使用finally执行那些不管有没有异常发生的代码。通常在finally块里会做一些清理工作,例如关闭文件,关闭连接。
  • 捕捉任何一个异常,使用as,而不要使用分号。例如:



try:
raise Error
except Error as error:
pass


 

Nested/Local/Inner Classes and Functions




内部类和函数是一个好东西。因为内部函数只能访问特定范围内的变量。




Default Iterators and Operators




使用默认的迭代器和操作,例如list, dict, file都支持这些功能。这些默认的迭代器和操作非常高效。例如,需要这样使用:

for key in adict
if key not in adict
if obj in alist
for line in afile
for k, v in adict.iteritems()


 

Default Argument Values




Python支持在函数的定义中,指定参数的默认值。这种机制可以实现重构,并且避免了大量的方法。但是,需要注意的是,在模块加载的时候,默认参数只被执行一次。所以,如果参数是可变对象,例如list dict,会出现问题。如果函数中改变了这些的内容,就会导致默认值也改变。所以:


  • 不要使用可变对象作为函数参数的默认值,可以使用None,例如:



def foo(a, b=None):
if b is None:
b = [] 






  • 函数的调用方需要显式指定有默认参数的参数名,例如:



def foo(a, b=1):
...
foo(1)
foo(1, b=2)
  

True/False Evaluations




尽可能地使用隐式的false表达。在Python中,所有空的值都被认为是false,例如:0 None [] {} ''。尽可能地使用这些隐式的表达,例如,使用if foo而不是if foo != []。有几条规则需要牢记于心:


  • 永远不要用== 或 != 来比较None,使用is 或者 is not。
  • 当你写下if x时,需要提醒自己你需要表达是if x is not None吗?有些时候,如果x是一个表达式,该表达的值可能是一个隐式的boolean值。
  • 永远不要用==来判断一个值是否是False,使用if not x。如果你需要区分x不是None的情况,应该这样用:if not x and x is not None。
  • 对于序列(string, list, tuple),要利用这个事实:空的序列是false。所以,要使用if seq或者if not seq而不是if len(seq)或者if not len(seq)。
  • 在处理整数时,默认的表达可能更危险(碰巧把None解析成0)。你可能需要将一个整数的值与0进行比较,例如:



if not users:
print 'no users'
if i == 0:
self.handle_zero()
if i % 10 == 0:
self.handle_multiple_of_ten()



 


  • 需要注意的是'0'(作为字符串)被解析成true。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370569-1-1.html 上篇帖子: PYTHON--常用函数(一) 下篇帖子: python 笔记 常用函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表