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 中这样做的惯用方式是什么?

4

2 回答 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 永远不是有效的默认值。

于 2011-02-08T18:58:14.443 回答
1

您可以根据*args和/或**kwargs.

getwrap这是基于的替代实现*args

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!'
于 2011-02-08T18:18:36.930 回答