不要Copy代码 - Python尾逗号导致的Bug
原文链接 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?