jy166102 发表于 2017-4-23 14:50:48

Python Language Rules

  Google 正在使用的Python 语言规则,翻译自下面链接
  http://google-styleguide.googlecode.com/svn/trunk/pyguide.html#Python_Language_Rules
  1. Lint
  使用在你的代码上运行pylint,lint是一个帮助开发人员找bug和风格问题的工具。
  2. Import
  因为有些module 名字比较短,所以说出现冲突的情况,解决方法是如果module 名字有冲突,加上包名。
  3. Packages
  新的代码应该导入每个模块的全路径名。

# Reference in code with complete name.(不推荐的)
import sound.effects.echo
# Reference in code with just module name (preferred).(推荐的)
from sound.effects import echo
  4. Exceptions
  使用异常意味着要打断正常的控制流程,所以使用的不好会导致控制流程混乱,而且在使用别人的库时,很容易丢失异常的情况。
  抛出自定义异常时使用

raise MyException('Error Message')
or
raise MyException
  不建议使用

raise MyException,'Error message'
raise 'Error message'
  不要使用catch-all ,减少try/except 中代码量,使用finally.
  5. Global variables
  全局变量少用,如果你的变量不够全局的话
  6. List comprehensions
  递推式构造列表提供了一种简单有效的方法来创建lists和iterators , 但是复杂的方法会让别人难以理解。
  所以写的时候要清晰,下面是两个例子:

Yes:
result = []
for x in range(10):
for y in range(5):
if x * y > 10:
result.append((x, y))
for x in xrange(5):
for y in xrange(5):
if x != y:
for z in xrange(5):
if y != z:
yield (x, y, z)
return ((x, complicated_transform(x))
for x in long_generator_function(parameter)
if x is not None)
squares =
eat(jelly_bean for jelly_bean in jelly_beans
if jelly_bean.color == 'black')
No:
result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
return ((x, y, z)
for x in xrange(5)
for y in xrange(5)
if x != y
for z in xrange(5)
if y != z)
  7. Default Iterators and Operations
  默认的迭代器和操作简单有效,不需要额外的方法调用,放心使用

Yes:for key in adict: ...
if key not in adict: ...
if obj in alist: ...
for line in afile: ...
for k, v in dict.iteritems(): ...
No:   for key in adict.keys(): ...
if not adict.has_key(key): ...
for line in afile.readlines(): ...
  8.Generators
  使用 "Yields:" 比使用 "Returns:" 要好。
  9. Lambda Functions and Conditional Expressions
  Lambda 功能和条件表达式,如果只有一行的话,可以,多了就别用了,因为可以让你的代码比较难懂。
  10. Default Argument Values
  别使用变化的对象做为方法的默认参数

Yes: def foo(a, b=None):
if b is None:
b = []
No:def foo(a, b=[]):
...
No:def foo(a, b=time.time()):# The time the module was loaded???
...
No:def foo(a, b=FLAGS.my_thing):# sys.argv has not yet been parsed...
...
  11. True/False evaluations
  如果可能的话使用隐式的false.
  当在一个条件表达式中,Python  会自动判断值是否是为false, 一个快速的检验方法是所有的“空”是false,比如,0,None, [], {}, '' 。
  这些规定比较简单,并且不容易出错,但是对c/c++开发人员来说比较奇怪。
  下面是一些例子

Yes: if not users:
print 'no users'
if foo == 0:
self.handle_zero()
if i % 10 == 0:
self.handle_multiple_of_ten()
No:if len(users) == 0:
print 'no users'
if foo is not None and not foo:
self.handle_zero()
if not i % 10:
self.handle_multiple_of_ten()
  12. Deprecated Language Features
  过期的特性就不要使用了,比如

Yes: words = foo.split(':')
for x in my_list if x == 5]
map(math.sqrt, data)    # Ok. No inlined lambda expression.
fn(*args, **kwargs)
No:words = string.split(foo, ':')
map(lambda x: x, filter(lambda x: x == 5, my_list))
apply(fn, args, kwargs)
  13. Lexical Scoping
  词法作用域。
  14. Function and Method Decorators
  当有好处的时候果断使用

class C(object):
@my_decorator
def method(self):
# method body ...
等价于:
class C(object):
def method(self):
# method body ...
method = my_decorator(method)

  15. Threading
  别依赖内建的原子类型
  16. Power Features
  避免使用这些。
  Python 有很多神奇的特性,比如metaclasses, access to bytecode , on-the-fly comilation, dynamic inheritance, object reparenting , import hacks, reflection ,modification of system internals.
  看起来很‘酷’,但是难读,难懂,难debug,少用吧。
页: [1]
查看完整版本: Python Language Rules