我有一些代码(别人写的):

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/

10-12 17:03