不要Copy代码 - Python尾逗号导致的Bug

2016-03-27 kk 更多博文 » 博客 » GitHub »

原文链接 http://www.kkblog.me/notes/%E4%B8%8D%E8%A6%81Copy%E4%BB%A3%E7%A0%81-Python%E5%B0%BE%E9%80%97%E5%8F%B7%E5%AF%BC%E8%87%B4%E7%9A%84Bug
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


在 python 中表示 tuple 很多种方式,下面是比较常用的两种

()
(1,)         1,  # 导致bug的尾逗号
(1,2)        1,2
(1,2,...)    1,2,...

下面详述 bug 的产生过程

首先我想要构建一个 dict,用作参数

params = {
    "a": 1,
    "b": 2,
    "c": 3,
}
do_something(**params)

然后发现需要根据条件 xxx 决定是否加上 c,于是从上面 copy 一下

params = {
    "a": 1,
    "b": 2,
}
if xxx:
    "c": 3,
do_something(**params)

加上方括号,冒号改成等号

params = {
    "a": 1,
    "b": 2,
}
if xxx:
    params["c"] = 3,
do_something(**params)

一个完美的 bug 就产生了,do_something 函数不一定会检查你的参数,只有运行到用到 c 参数的代码才会出问题,运气好会报个错告诉你参数类型不对,运气不好代码正常运行,最后结果就是不对劲。

谨记:

不要copy代码!!

参考链接:
A Python gotcha: Stray comma at end of simple assignment
Python: stray commas cause tuples?