Python代码风格规范

参考自 <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 来取代低级别的锁了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,682评论 0 5
  • Python是一种对代码风格很重视的语言,从缩进就能看出这一点,Python强调易于理解。最近在负责代码重构的工作...
    知曰阅读 10,840评论 1 85
  • 教程总纲:http://www.runoob.com/python/python-tutorial.html 进阶...
    健康哥哥阅读 2,017评论 1 3
  • 前言 ||| 第二章 使用ArcPy编写脚本 Python支持大部分在其他语言中出现的编程结构。在本章内容中,我们...
    muyan阅读 90,002评论 10 55
  • Wander 原理: 使智能体能有随机的操控力,使它能在场景中国随机移动。方案一:简单实现方案方案二: 圆上随机 ...
    Levi_Wan阅读 1,208评论 0 1