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

Ali*_*uis 14 python dictionary keyword-argument python-2.7 python-3.x

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

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

def custom_function2(**kwargs):
    foo = kwargs.get('foo')
    bar = kwargs.get('bar')
    ...
Run Code Online (Sandbox Code Playgroud)

Dhi*_*aTN 19

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

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

pop(key [,default])如果key在字典中,则删除它并返回其值,否则返回default.如果未给出default并且key不在字典中,KeyError则引发a.

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

注意:关于最佳实践问题,我会说这取决于你的使用案例,但我会默认使用,.get除非我真的需要.pop


sso*_*ler 8

考虑下一个示例,其中使用getorpop有所不同:

让我们开始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')
Run Code Online (Sandbox Code Playgroud)

此代码片段引发TypeError异常:

TypeError: __init__() got an unexpected keyword argument 'bar_param'
Run Code Online (Sandbox Code Playgroud)

当 Bar 执行时,super(Bar, self).__init__(**kwargs)它会向 Foo 转发他收到的同一个 dict: {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')
Run Code Online (Sandbox Code Playgroud)

输出是:

In Bar: B
In Foo: F
Run Code Online (Sandbox Code Playgroud)


hwh*_*te4 6

所以 get 和 pop 函数做了非常不同的事情

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

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

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


shx*_*hx2 6

不同之处pop还在于从dict中删除了该项目.

没有最好的做法.使用更方便您的特定用例的那个.

大多数时候,你所需要的只是get价值.

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

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