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
是否正在使用其他方法来测试可选参数?或者它是否使用了一些更深奥的默认值?
答案 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