美文网首页
Python代码风格规范

Python代码风格规范

作者: 蒋狗 | 来源:发表于2017-02-13 14:07 被阅读0次

    参考自 <a href="http://code.google.com/p/zh-google-styleguide/">《Google Python Style Guide》</a> 和 <a href="http://mp.weixin.qq.com/s/JuVacWyjDxOvqwSppn156Q">Python最佳实践 -- 董伟明</a>。

    平时遵循PEP8规范,阅读上述文章后其他值得注意且常用的点。

    1. 类和异常命名首字母大写,但模块名用小写加下划线的链接的方式。

    2. 变量名不要用单个字符。(除非变量名含义可从上下文很容易看出来)
      例如:

    for i, val in enumerate([1, 2, 3]):
        print('index %s, value is %s' % (i, val))
    
    1. 变量避免重复命名。
    import audio
    # core = audio.AudioCore()  # 不合适
    core = audio.Core()
    
    1. 把代码引用部分放在文件的顶部,按下面的顺序分成三个部分,每个部分之间空一行。
      • 系统引用
      • 第三方引用
      • 本地引用

    理由:明确显示每个模块的引用来源。

    1. 一个类不继承自其他类,则让它显示的继承Object,嵌套类也一样。

    继承自 object 是为了使属性(properties)正常工作, 并且这样可以保护你的代码, 使其不
    受Python 3000 的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方
    法实现了对象的默认语义, 包括 __new__, __init__, __delattr__, __getattribute__,
    __setattr__, __hash__, __repr__, and __str__ .

    1. 避免在循环中对字符串进行++=操作。利用list''.join()

    避免在循环中用+和+=操作符来累加字符串. 由于字符串是不可变的, 这样做会创建不必要的临时对象, 并且导致二次方而不是线性的运行时间. 作为替代方案, 你可以将每个子串加入列表, 然后在循环结束后用 .join 连接列表. (也可以将每个子串写入一个cStringIO.StringIO 缓存中.)

    items = ['<table>']
    for p in person:
         items .append('<tr><td>%s</td><td>%s</td></tr>' % (p.name, p.age))
    items .append('</table>')
    person_table = ''.join(items)
    
    1. 通常每个语句独占一行,当单个if时也可以。
    if check(): do_someting()
    
    1. 默认参数值适用于大部分情况。但不要将默认参数值设置为可变对象。

    默认参数只在模块加载时求值一次. 如果参数是列表或字典之类的可变类型, 这可能
    会导致问题. 如果函数修改了对象(例如向列表追加项), 默认值就被修改了.

    函数定义的时候默认值参数赋值一次,下例来自《Python CookBook》第7.5节。

    x = 42
    def spam(a, b=x):
        print(a, b)
    
    spam(1)  # 1 42
    x = 23  # 给x重新赋值但没有影响到默认值参数
    spam(1)  #  42
    

    当默认值参数不能使是可变对象。

    如果你这么做了,当默认值在其他地方被修改后你将会遇到各种麻烦。这些修改会影响到下次调用这个函数时的默认值。

    def spam(a, b=[]):  # 不合适
        print(b)
        return b
    
    x = spam(1)  # []
    x.append(99)
    x.append('Yow!')
    spam(1)  # [99, 'Yow!']
    

    更好的方式:

    def spam(a, b=None):
        if b is None:  # 最好不要用 if not b, False, 0等也会被当成False
            b = []
        print(b)
        return b
    
    1. 线程方面。
    • 不要依赖内建类型的原子性

    虽然Python 的内建类型例如字典看上去拥有原子操作, 但是在某些情形下它们仍然不是原子的(即: 如果__hash__或__eq__被实现为Python 方法)且它们的原子性是靠不住的. 你也不能指望原子变量赋值(因为这个反过来依赖字典).
    优先使用Queue 模块的 Queue 数据类型作为线程间的数据通信方式. 另外, 使用threading 模块及其锁原语. 了解条件变量的合适使用方式, 这样你就可以使用threading.Condition 来取代低级别的锁了.

    相关文章

      网友评论

          本文标题:Python代码风格规范

          本文链接:https://www.haomeiwen.com/subject/pjhzittx.html