zjm*_*126 83 python dictionary
class a(object):
data={'a':'aaa','b':'bbb','c':'ccc'}
def pop(self, key, *args):
return self.data.pop(key, *args)#what is this mean.
b=a()
print b.pop('a',{'b':'bbb'})
print b.data
Run Code Online (Sandbox Code Playgroud)
self.data.pop(key, *args) ←------为什么还有第二个参数?
Ale*_*lli 111
popdicts 的方法(self.data比如{'a':'aaa','b':'bbb','c':'ccc'},这里)有两个参数 - 参见文档
第二个参数default是,pop如果没有第一个参数key,则返回.(如果pop只用一个参数调用,key如果该键不存在则会引发异常).
在你的例子中print b.pop('a',{'b':'bbb'}),这是无关紧要的,因为它'a' 是一个关键b.data.但如果你重复这一行...:
b=a()
print b.pop('a',{'b':'bbb'})
print b.pop('a',{'b':'bbb'})
print b.data
Run Code Online (Sandbox Code Playgroud)
你会看到它有差别:第一pop删除'a'键,所以在第二pop的default居然是返回参数(因为'a'现在缺席b.data).
Jam*_*ley 27
这里有很多问题.我看到至少两个,也许三个:
*args用于?第一个问题在Python标准库参考中得到了简单的回答:
pop(key [,default])
如果key在字典中,则将其删除并返回其值,否则返回default.如果未给出default并且key不在字典中,则引发KeyError.
第二个问题在Python语言参考中有所介绍:
如果存在"*identifier"形式,则将其初始化为接收任何多余位置参数的元组,默认为空元组.如果存在"**标识符"形式,则将其初始化为接收任何多余关键字参数的新字典,默认为新的空字典.
换句话说,该pop函数至少需要两个参数.前两个被分配名称self和key; 其余的被塞进一个叫做的元组中args.
*args在调用中传递的下一行发生的是self.data.pop与此相反的 - 元组*args被扩展为传递的位置参数.这在Python语言参考中有解释:
如果语法*表达式出现在函数调用中,则表达式必须求值为序列.来自此序列的元素被视为它们是附加的位置参数
简而言之,a.pop()希望灵活并接受任意数量的位置参数,以便它可以将这个未知数量的位置参数传递给self.data.pop().
这给你灵活性; data恰好是dict正确的,因此self.data.pop()需要一个或两个参数; 但是如果你改成data了一个类型,它接受了19个参数来调用self.data.pop()你就不必改变类a了.您仍然必须更改任何调用a.pop()以传递所需的19个参数的代码.
>>> def func(a, *args, **kwargs):
... print 'a %s, args %s, kwargs %s' % (a, args, kwargs)
...
>>> func('one', 'two', 'three', four='four', five='five')
a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}
Run Code Online (Sandbox Code Playgroud)
>>> def anotherfunct(beta, *args):
... print 'beta %s, args %s' % (beta, args)
...
>>> def func(a, *args, **kwargs):
... anotherfunct(a, *args)
...
>>> func('one', 'two', 'three', four='four', five='five')
beta one, args ('two', 'three')
>>>
Run Code Online (Sandbox Code Playgroud)
def func(*args):
pass
Run Code Online (Sandbox Code Playgroud)
当您以这种方式定义函数时,*args将传递给函数的参数数组.这允许您的函数在不事先知道将向其传递多少参数的情况下工作.
您也可以使用关键字参数执行此操作**kwargs:
def func2(**kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
请参阅:任意参数列表
在您的情况下,您已经定义了一个类似字典的类.该dict.pop方法定义为pop(key[, default]).
您的方法不使用该default参数.但是,通过定义你的方法*args,并传递*args到dict.pop(),您允许呼叫者使用的default参数.
换句话说,您应该能够使用您的类的pop方法,如dict.pop:
my_a = a()
value1 = my_a.pop('key1') # throw an exception if key1 isn't in the dict
value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict
Run Code Online (Sandbox Code Playgroud)