`
bofang
  • 浏览: 126506 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Google的python编程规范

阅读更多




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

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。





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics