我有一些代码(别人写的):
def render(self, name, value, attrs=None):
if not attrs:
attrs = {}
attrs.update({'class': 'ui-autocomplete-input'})
我认为可以将其重写为:
def render(self, name, value, attrs={}):
attrs.update({'class': 'ui-autocomplete-input'})
如果有人传入
attrs=None
,这当然会失败,但这是可以预期的吗? attrs={}
是否有罚款(多余的字典创建?)我对python还是太陌生,无法回答这些问题,但是我很好奇。
当我在解释器中对此进行测试时,我得到:
>>> def x(attrs={}):
... attrs.update({'a': 'b'})
... print attrs
...
>>> x({'b': 'c'})
{'a': 'b', 'b': 'c'}
>>> x({'d': 'e'})
{'a': 'b', 'd': 'e'}
>>> x()
{'a': 'b'}
这怎么会引起问题?请注意,即使用户指定了一个字典,我也总是将该字典添加到attrs中(这实际上可能指向另一个问题(如果存在,我应该将class属性与现有属性合并)。
-------------------并指出以上缺陷------------------
>>> def yikes(attrs):
... attrs.update({'something': 'extra'})
... print attrs
>>> def x(attrs={}):
... print "Before:", attrs
... attrs.update({'a': 'b'})
... print "After:", attrs
... yikes(attrs)
>>> x({"b": "c"})
Before: {'b': 'c'}
After: {'a': 'b', 'b': 'c'}
{'a': 'b', 'b': 'c', 'something': 'extra'}
>>> x()
Before: {}
After: {'a': 'b'}
{'a': 'b', 'something': 'extra'}
看起来还可以,这是什么问题?
>>> x()
Before: {'a': 'b', 'something': 'extra'}
After: {'a': 'b', 'something': 'extra'}
{'a': 'b', 'something': 'extra'}
嗯,现在我明白了,如果
{'something': 'extra'}
是由其他一些代码添加的,则永远不会被清除。当然,我强制要使用的attrs在那里,但不应包含的{'something': 'extra'}
也是如此。这很微妙,足以成为混淆竞赛的饲料,请注意PERL! 最佳答案
在函数签名中使用attrs = {}
会伤您,因为它将在连续调用该函数时保留其值。原始代码是最好的。
例如。
>>> def a(attrs= {}):
... print attrs
... attrs.update({1:1})
...
>>> a()
{}
>>> a()
{1: 1}
注意在第二次调用时它如何保持第一次分配的值。
关于python - 处理Python中默认参数的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7017414/