2010-01-02 142 views
61
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 

self.data.pop(key, *args) ← ------为什么会有第二个参数?在Python中,dict.pop(a,b)是什么意思?

+5

或者,如果你实在懒'帮助(b.data.pop)'在REPL。 – 2012-04-25 13:54:11

回答

84

类型的字典(如self.data,即{'a':'aaa','b':'bbb','c':'ccc'},在这里)的pop方法有两个参数 - 见the docs

如果第一个参数key不存在,则第二个参数defaultpop的返回值。 (如果您拨打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 

你会看到它有差别:第一pop删除'a'关键,所以在第二popdefault说法实际上是返回(因为'a'现缺席b.data)。

+1

只是一个小的评论,我认为在用户需要'弹出''dict'元素的某些情况下,保留popped元素的值是很重要的。所以,'字典。pop(key)''将'key'和相关的'value'一起移除,但也返回刚刚被移除的'key'的'value'。我发现它很有用... – flamenco 2017-12-31 02:00:59

5
def func(*args): 
    pass 

当你定义一个函数这样,*args将是传递给函数的参数数组。这允许你的函数在事先不知道有多少参数将被传递给它的情况下工作。

您与关键字参数也做到这一点,利用**kwargs

def func2(**kwargs): 
    pass 

参见:Arbitrary argument lists


在你的情况,你定义它像个字典的类。 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 
21

这里有很多问题。我看到至少有两个,也许三个:

  • pop(a,b)做了什么?/为什么会有第二个参数?
  • *args是什么使用?

的第一个问题是在Python Standard Library参考平凡回答:

弹出(键[默认])

如果键是在字典中,将其取出并返回其值,否则返回默认值。 如果未给出默认值并且键不在字典中,则会引发KeyError。


第二个问题是包括在Python Language Reference

如果表单“*标识符”存在时, 它被初始化为一个元组接收 任何过量的位置参数, 默认到空元组。如果存在 形式的“**标识符”,则它是 初始化为新的字典 接收任何多余的关键字 参数,默认为新的空字典 。

换句话说,pop函数至少需要两个参数。前两个分配名称为selfkey;其余的都塞进一个名为args的元组中。

发生了什么事就当*args沿着呼叫传递给self.data.pop下一行是这一反 - 元组*args扩大到相处传递位置参数。这是在Python Language Reference解释说:

如果语法*表达 出现的函数调用,表达式必须 计算出一个序列。从 这个序列的元素被视为它们 是其它位置参数

总之,a.pop()要灵活,接受任何数目的位置参数,以便它可以传递给这个数目不详的位置参数self.data.pop()

这给你灵活性; data现在恰好是dict,所以self.data.pop()需要一个或两个参数;但是如果您将data更改为需要19个参数来呼叫self.data.pop()的类型,则根本不需要更改类a。您仍然必须更改任何名为a.pop()的代码,以通过所需的19个参数。

+1

+1。我担心OP的英文不符合阅读答案的任务。 – bernie 2010-01-02 07:53:34

+0

我在阅读OPs配置文件之前写道。我现在已经阅读了所说的简介并看到了其他几个OP的问题。我刚刚做了另一次尝试,这次只使用代码:) – 2010-01-02 09:57:21

5
>>> 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'} 

>>> 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') 
>>> 
+0

你甚至读过这个问题吗? – SilentGhost 2010-01-02 12:52:27

+1

我阅读了几个问题,详见我的其他答案。我还阅读了OP的配置文件,并意识到我的其他答案是无用的。这个答案应该证明至少是什么*参数的一部分,这是我猜测操作系统真正的混乱,尽管这个问题。 – 2010-01-02 13:20:22

+0

@James,额外的努力+1。我对这个真正的问题达成了同样的结论。 – 2010-01-02 15:58:12