可变函数参数默认值的良好用法?
将可变对象设置为函数中参数的默认值是常见的错误。 以下是David Goodger撰写的优秀文章的一个例子:
>>> def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
>>> print bad_append('one')
['one']
>>> print bad_append('two')
['one', 'two']
这种情况发生的原因就在这里。
现在对于我的问题: 这种语法是否有很好的用例?
我的意思是,如果每个遇到它的人都犯了同样的错误,那么调试它,理解这个问题并从中尝试避免它,那么这种语法有什么用处呢?
您可以使用它在函数调用之间缓存值:
def get_from_cache(name, cache={}):
if name in cache: return cache[name]
cache[name] = result = expensive_calculation()
return result
但通常这样的事情可以通过一个类来完成,因为您可以拥有额外的属性来清除缓存等。
import random
def ten_random_numbers(rng=random):
return [rng.random() for i in xrange(10)]
使用random
模块,实际上是一个可变单例,作为其默认的随机数生成器。
也许你不会改变可变参数,但确实需要一个可变参数:
def foo(x, y, config={}):
my_config = {'debug': True, 'verbose': False}
my_config.update(config)
return bar(x, my_config) + baz(y, my_config)
(是的,我知道你可以在这个特殊情况下使用config=()
,但是我觉得不那么清晰,不太一般。)
上一篇: Good uses for mutable function argument default values?