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

在 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?

Back

留言 - Github Issues | 主题 - The Plain