剛發(fā)現一個若干月前寫的日志草稿撒犀,那個“今天”都不知道是什么時候了……
這個bug挺搞笑的,而且可能也比較容易踩坑。而且ly平時效率超高缰雇,什么事都是一下子就做好了,而這個bug我和ly花半天時間debug才發(fā)現追驴,發(fā)現后兩人都哭笑不得械哟,也讓我印象深刻。
今天遇到一個很有趣的bug殿雪。
項目里用約4層嵌套的字典暇咆、列表等記錄configuration,形如:
conf = {
'aa': {'a': 1, 'b': 2, 'c': [3, 4, 5]},
'bb': [1, 2, 3],
'cc': {
'aaa': [1, 2, 3],
'bbb': [
[9, 8, 7],
1,
]
}
}
然后用一個遞歸函數去讀它:
def confValues(self, vals, conf=None):
if conf is None:
conf = self.conf
if isinstance(conf, collections.MutableMapping):
return {k: self.confValues(vals, conf=v) for k, v in conf.items()}
elif isinstance(conf, (list, tuple)):
return [self.confValues(vals, conf=v) for v in conf]
elif isinstance(conf, (str, unicode)) and conf.startswith("_"):
return self.varValue(conf, vals)
else:
return conf
稍微說一下,confValues這個函數內部實際上實現什么具體功能并不重要爸业,只要知道關鍵的一點是它要把conf里的值作為參數conf遞歸下去就行了其骄。
這套東西是同事寫的,我用他的代碼扯旷,改conf來適應我的需求拯爽。我的conf里的其中一個參數的值是None,于是程序一直出錯钧忽,參數讀不進去毯炮。我和同事debug了半天,終于發(fā)現原來玄機在confValues函數里conf變量初始化的設定中——遞歸函數用來標記初始化的無意義的None正好和conf里的有意義的值None沖突了惰瓜。我把conf用來初始化的默認標記由None改成"initial_conf"(只要是不可能出現在conf里的值就行了)否副,就沒問題了。