Pythonでは、dict.pop(a、b)はどういう意味ですか?


92
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) ←------ 2番目の引数があるのはなぜですか?


8
またはhelp(b.data.pop)、REPLで本当に怠惰な場合。
Michael Mior

回答:


120

popdictsの方法は、(のようなself.data、すなわち{'a':'aaa','b':'bbb','c':'ccc'}、ここでは)二つの引数を取る-を参照してドキュメントを

2番目の引数はdefaultpop最初の引数がない場合に返されるものkeyです。(pop引数を1つだけ呼び出した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'キーが削除されるため、2番目popdefault引数は実際に返されます('a'現在はに存在しないためb.data)。


3
ユーザーがpop要素を必要とするdictがポップされた要素の値を保持する必要があるいくつかの状況では重要だと私が思う小さなコメントです。だから、dict.pop(key)削除keyに関連すると共に、をvalueも返すvaluekeyだけ削除されたことを。便利だと思いました...
2017

@flamencoそれは私が期待することですpop()-JavaScript、PHP、Javaなどのより多くの言語での一般的な動作ですが、すべての言語がそうするわけではありません-例えばC ++。
jave.web

27

ここには非常に多くの質問があります。私は少なくとも2つ、おそらく3つを参照してください。

  • pop(a、b)は何をしますか?/なぜ2番目の引数があるのですか?
  • *argsに使用されていますか?

最初の質問は、Python標準ライブラリリファレンスで簡単に答えられます。

pop(key [、default])

キーが辞書にある場合、それを削除してその値を返し、そうでない場合はデフォルトを返します。デフォルトが指定されておらず、キーが辞書にない場合、KeyErrorが発生します。


2番目の質問は、Python言語リファレンスで説明されています。

「* identifier」という形式が存在する場合、余分な位置パラメータを受け取るタプルに初期化され、デフォルトでは空のタプルになります。「** identifier」の形式が存在する場合、余分なキーワード引数を受け取る新しい辞書に初期化され、デフォルトで新しい空の辞書になります。

つまり、このpop関数は少なくとも2つの引数を取ります。最初の2つには名前selfとが割り当てられkeyます。残りはと呼ばれるタプルに詰められargsます。

*argsへの呼び出しで渡されるときに次の行で何が起こっているかself.data.popはこれの逆です- *args渡される位置パラメータのタプルが展開されます。これはPython言語リファレンスで説明されています:

構文* expressionが関数呼び出しにある場合、expressionはシーケンスに評価される必要があります。このシーケンスの要素は、追加の位置引数であるかのように扱われます

要するに、a.pop()は柔軟性があり、任意の数の位置パラメーターを受け入れたいので、この不明な数の位置パラメーターをに渡すことができますself.data.pop()

これにより柔軟性が得られます。dataたまたまdict今なのでself.data.pop()、1つまたは2つのパラメーターをとります。しかしdata、呼び出しに19個のパラメーターを使用する型に変更した場合、self.data.pop()クラスを変更する必要はまったくありませんaa.pop()ただし、必要な19個のパラメーターを渡すために呼び出すコードを変更する必要があります。


2
努力の+1。OPの英語があなたの答えを読むのに役立っていないのではないかと心配です。
Mechanical_meat

私はOPsプロファイルを読む前にそれを書きました。私は今、上記のプロファイルを読み、OPの質問の他のいくつかを見ました。今度はコードのみを使用して別の試みをしました:)
James Polley

6
def func(*args): 
    pass

この方法で関数を定義すると、関数に*args渡される引数の配列になります。これにより、関数に渡される引数の数が事前にわからなくても、関数を機能させることができます。

次のコマンドを使用して、キーワード引数でもこれを行います**kwargs

def func2(**kwargs): 
    pass

参照:任意の引数リスト


あなたの場合、あなたは辞書のように振る舞うクラスを定義しました。dict.pop方法は以下のように定義されますpop(key[, default])

メソッドはdefaultパラメーターを使用しません。しかし、とあなたの方法を定義することによって、*argsおよび渡す*argsdict.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

6
>>> 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')
>>> 

1
私は他の回答で詳述されているように、いくつかの質問を読みました。私はOPsプロファイルも読んで、他の答えは役に立たないことに気付きました。この答えは、* argsが行うことの少なくとも一部を示しているはずです。これは、件名にもかかわらず、OPの真の混乱を推測していることです。
James Polley、2010年

@ジェームス、余分な努力のために+1。本当の質問についても同じ結論に達しました。
Peter Hansen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.