【发布时间】:2020-08-02 19:55:11
【问题描述】:
我的代码在 pylint 中触发警告:
def getInsertDefault(collection=['key', 'value'], usefile='defaultMode.xml'):
return doInsert(collection,usefile,True)
警告很清楚,它是可变默认参数,我明白了在某些情况下它可能会给正在发生的事情带来错误的印象。 SA 上已经有好几篇文章了,但感觉这里没有涵盖这一篇。 大多数问题和示例都处理空列表,这些列表被弱引用并可能导致错误。
我也知道将代码更改为getInsertDefault(collection=None ...) 是更好的做法,但在这种默认初始化方法中,我不打算对列表做任何事情,除了阅读,(为什么)我的代码是危险的或会导致陷阱吗?
--编辑--
直截了当:Why is the empty dictionary a dangerous default value in Python? 将回答这个问题。 种类:我知道我的代码违反了约定,可能会导致陷阱 - 但在这个非常具体的情况下:我安全吗?
我发现 cmets 中的建议对使用 collection=('key', 'value') 很有用,因为它既传统又安全。尽管如此,出于纯粹的兴趣:我之前的尝试是否能够产生某种重大问题?
【问题讨论】:
-
由于您似乎只需要一些元素序列,因此请考虑使用元组(即
getInsertDefault(collection=('key', 'value'), ...)),因为元组是不可变的。 -
@metatoaster - 你的第一个答案是“有点”的答案。我将其解释为:在我的情况下什么都不会发生,但这是不好的做法,因为在某些情况下可能会导致错误。那是对的吗?我想确保我没有监督任何基本的事情。
-
@metatoaster - 您的第二个答案实际上很有帮助。这是一个不错的选择,我已经实现了
-
@Qohelet 您正在监督一些基本的事情:代码往往会随着时间而发展。有关更多信息,请参阅我的答案。
标签: python python-3.x reference