指定默认参数的惯用方法及其存在与否的影响

3

我经常看到Python代码使用默认参数,并在未指定时具有特殊行为。

例如,如果我想要以下行为:

def getwrap(dict, key, default = ??):
    if ???: # default is specified
        return dict.get(key, default)
    else:
        return dict[key]

如果我要自己做,我会得到这样的东西:
class Ham:
    __secret = object()
    def Cheese(self, key, default = __secret):
        if default is self.__secret:
            return self.dict.get(key, default)
        else:
            return self.dict[key]

但我不想在肯定存在标准的情况下发明愚蠢的东西。在Python中,什么是惯用的方法呢?


这在Plone中并不完全罕见,通常被称为“_marker”。 - Ulrich Schwarz
2个回答

6
我通常更喜欢的是:

def getwrap(my_dict, my_key, default=None):
    if default is None:
        return my_dict[my_key]
    else:
        return my_dict.get(my_key, default)

当然,这假设None从未是有效的默认值。

1
如果None是一个有效的默认值,那么它被误用了。很容易设计事物,使得None真正成为例外情况。 - S.Lott

1

你可以基于*args和/或**kwargs来实现它。

这是一个基于*argsgetwrap的替代实现:

def getwrap(my_dict, my_key, *args):
    if args:
        return my_dict.get(my_key, args[0])
    else:
        return my_dict[my_key]

现在让我们来看看它的实际效果:

>>> a = {'foo': 1}
>>> getwrap(a, 'foo')
1
>>> getwrap(a, 'bar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in getwrap
KeyError: 'bar'
>>> getwrap(a, 'bar', 'Nobody expects the Spanish Inquisition!')
'Nobody expects the Spanish Inquisition!'

+1 是一种实现的方式,但出于可读性的原因,我无法忍受它。 - porgarmingduod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接