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

mat*_*ots 5 python

d = dict()
d.pop('hello', None) # No exception thrown
d.pop('hello', 0)    # No exception thrown
d.pop('hello')       # KeyError
Run Code Online (Sandbox Code Playgroud)

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

我想不出任何其他dict.pop可能使用的"自然"默认值.

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

Dan*_*man 11

好吧,dict用C实现,所以Python语义并不真正适用.否则,我会说在任何情况下都要查看来源.

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

sentinel = object()

def get(value, default=sentinel):
    if default is sentinel:
       # etc
Run Code Online (Sandbox Code Playgroud)

这是一个合适的用法is,因为你要确保你正在检查确切的sentinel对象,而不仅仅是评估等于它的东西.