Python:kwargs.pop()和kwargs.get()之间的区别

时间:2018-03-11 08:56:25

标签: python dictionary parameter-passing default-value keyword-argument

我已经看过两种方式,但我不明白区别是什么,我应该用什么作为"最佳实践":

def custom_function(**kwargs):
    foo = kwargs.pop('foo')
    bar = kwargs.pop('bar')
    ...

def custom_function2(**kwargs):
    foo = kwargs.get('foo')
    bar = kwargs.get('bar')
    ...

4 个答案:

答案 0 :(得分:12)

  

get(key[, default]):如果key在字典中,则返回key的值,否则返回默认值。如果未给出default,则默认为None,因此此方法永远不会引发KeyError

d = {'a' :1, 'c' :2}
print(d.get('b', 0)) # return 0
print(d.get('c', 0)) # return 2
  

pop(key[, default])如果键在字典中,删除它并返回其值,否则返回默认值。如果未给出默认值且密钥不在字典中,则会引发KeyError

d = {'a' :1, 'c' :2}
print(d.pop('c', 0)) # return 2
print(d) # returns {'a': 1}
print(d.get('c', 0)) # return 0

NB:关于最佳做法问题,我会说这取决于您的使用案例,但默认情况下我会.get,除非我真的需要.pop

答案 1 :(得分:5)

差异是pop也会从字典中删除该项目。

没有最佳做法。使用对您的特定用例更方便的那个。

大多数情况下,您需要的只是get值。

其他时候,您希望确保不提供额外/意外的kwargs。在这种情况下,使用pop很方便。 E.g:

a = kw.pop('a')
b = kw.pop('b')
if kw:
    raise TypeError('Unepxected kwargs provided: %s' % list(kw.keys()))

答案 2 :(得分:2)

所以get和pop函数做了很多不同的事情

get用于返回字典中给定键的值

pop从字典中删除值并返回删除的值

这里记录了所有字典函数(对于python3):https://docs.python.org/3/library/stdtypes.html#mapping-types-dict

答案 3 :(得分:2)

考虑下一个示例,其中使用getpop会产生影响:

让我们从get开始:

class Foo(object):
    def __init__(self, foo_param=None):
        print("In Foo: {}".format(foo_param))

class Bar(Foo):
    def __init__(self, **kwargs):
        bar_param = kwargs.get('bar_param')
        print("In Bar: {}".format(bar_param))
        super(Bar, self).__init__(**kwargs)

bar = Bar(foo_param='F', bar_param='B')

此代码段引发TypeError异常:

TypeError: __init__() got an unexpected keyword argument 'bar_param'

当Bar执行super(Bar, self).__init__(**kwargs)时,它会转发给Foo他收到的同一个词:{foo_param='F', bar_param='B'}。然后Foo引发TypeError因为输入参数不尊重它的界面。

如果您在执行pop调用之前bar_param super,则Foo只会重新获取所需的输入参数foo_param,并且一切正常。

class Foo(object):
    def __init__(self, foo_param=None):
        print("In Foo: {}".format(foo_param))

class Bar(Foo):
    def __init__(self, **kwargs):
        bar_param = kwargs.pop('bar_param')
        print("In Bar: {}".format(bar_param))
        super(Bar, self).__init__(**kwargs)

bar = Bar(foo_param='F', bar_param='B')

输出是:

In Bar: B
In Foo: F