dict.pop()如何检测是否已传递可选参数?

时间:2014-03-25 08:47:54

标签: python

d = dict()
d.pop('hello', None) # No exception thrown
d.pop('hello', 0)    # No exception thrown
d.pop('hello')       # KeyError

我原以为在Python中我们通常通过使用某种默认值测试参数来测试是否传递了默认参数。

我想不出dict.pop会使用的任何其他“自然”默认值。

dict.pop是否正在使用其他方法来测试可选参数?或者它是否使用了一些更深奥的默认值?

2 个答案:

答案 0 :(得分:10)

好吧,dict是用C实现的,所以Python语义并不适用。否则,我无论如何都要看源。

然而,一个好的模式是使用sentinel作为默认值。这将永远不会与传入的任何内容相匹配,因此您可以确定如果您获得该值,则只有一个参数。

sentinel = object()

def get(value, default=sentinel):
    if default is sentinel:
       # etc

这是is的恰当用法,因为您希望确保您正在检查确切的哨兵对象,而不仅仅是评估等于它的东西。

答案 1 :(得分:2)

可能是这样的事情。

def pop(_dict, val, *args):
    if val in _dict:
        return _dict.pop(val)
    elif args:
        return args[0]
    else:
        raise KeyError()

示例:

In [5]: pop({}, 'a')

KeyError:

In [6]: pop({}, 'a', 0)
Out[6]: 0