【问题标题】:What is the default value of the "default" parameter in dict.pop(key[, default])?dict.pop(key[, default]) 中“default”参数的默认值是多少?
【发布时间】:2020-03-24 20:52:55
【问题描述】:

似乎dict.pop() 可以区分用户指定的“默认”和真正的默认(省略)。
例如(实际结果):

my_dict.pop('non-exist-key', None)
my_dict.pop('non-exist-key')
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#KeyError: 'non-exist-key'

我希望 dict.pop 有一个“默认”参数的默认值,否则我希望结果:

#Throw exception in caller rather than in callee(my_dict.pop)
my_dict.pop('non-exist-key')
#TypeError: my_dict.pop() missing 1 required positional argument: 'default'

【问题讨论】:

  • 没有,这就是您收到错误的原因
  • 您链接的文档确切地说,“如果没有给出默认值并且键不在字典中,则会引发 KeyError。”
  • @roganjosh 我相信有一个默认值,请参阅我的更新。
  • 你为什么这么相信?
  • 我意识到我自己并不理解它。 FWIW 它提示我问my own question。我删除了,因为我不能确定我给你的信息是正确的

标签: python


【解决方案1】:

pop() 方法从具有给定键的字典中删除并返回一个元素。

语法是dictionary.pop(key[, default])

pop() 方法返回:

  1. 如果找到键 - 从字典中删除/弹出元素
  2. 如果未找到键 - 指定为第二个参数的值(默认)
  3. 如果未找到密钥且未指定默认参数 - 引发 KeyError 异常

    example_dict = {"a": 1, "b": 2}

我们在这里初始化了字典。

example_dict.pop("c", None)

该语句返回 None,因为我们在第二个参数中指定了它。

example_dict.pop("c")

这将引发 keyerror。

def pop(self, *args):
    """
    Remove and return the value for a key.
    """
    have_default = len(args) == 2
    try:
        v = self[args[0]]
    except KeyError:
        if have_default:
            return args[1]
        raise
    else:
        del self[args[0]]
        return v

这是pop函数的纯python实现。

【讨论】:

  • 为什么它没有引发一个 TypeError 的“必需的位置参数”?
  • 因为这是一个可选参数,所以即使没有给出参数,函数调用也会起作用。如果它澄清了您的疑问,请接受答案。
  • 它没有让我明白。我仍然不知道python中真正的实现细节,但我意识到这些东西可以通过check number of parameters在python代码中实现,而不仅仅是在def语句中提供一个常规的默认参数。
  • 检查我添加到答案中的python实现。
猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 2010-12-20
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多