我已经看过两种方式,但我不明白区别是什么,我应该用什么作为"最佳实践":
def custom_function(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...
def custom_function2(**kwargs):
foo = kwargs.get('foo')
bar = kwargs.get('bar')
...
答案 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)
考虑下一个示例,其中使用get
或pop
会产生影响:
让我们从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