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
考虑下一个示例,其中使用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)
所以 get 和 pop 函数做了非常不同的事情
get 用于返回字典中给定键的值
pop 从字典中删除值并返回删除的值
所有字典函数都记录在此处(对于 python3):https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
不同之处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)
| 归档时间: |
|
| 查看次数: |
14888 次 |
| 最近记录: |