web-dev-qa-db-ja.com

Python:kwargs.pop()とkwargs.get()の違い

私は両方の方法を見てきましたが、違いが何であり、「ベストプラクティス」として使用すべきものを理解していません。

def custom_function(**kwargs):
    foo = kwargs.pop('foo')
    bar = kwargs.pop('bar')
    ...

def custom_function2(**kwargs):
    foo = kwargs.get('foo')
    bar = kwargs.get('bar')
    ...
13
Aliquis

get(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]) keyが辞書にある場合、それを削除して値を返します。それ以外の場合はデフォルトを返します。デフォルトが指定されておらず、キーが辞書にない場合、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

17
DhiaTN

違いはpopもディクショナリからアイテムを削除します。

ベストプラクティスはありません。特定のユースケースにより便利なものを使用してください。

ほとんどの場合、必要なのは値をgettingすることだけです。

また、余分な/予期しないkwargsが提供されないようにしたい場合もあります。この場合、popを使用すると便利です。例えば。:

a = kw.pop('a')
b = kw.pop('b')
if kw:
    raise TypeError('Unepxected kwargs provided: %s' % list(kw.keys()))
6
shx2

そのため、get関数とpop関数は非常に異なることを行います

getは、ディクショナリ内の指定されたキーの値を返すために使用されます

popは辞書から値を削除し、削除された値を返します

辞書関数はすべてここに記載されています(python3の場合): https://docs.python.org/3/library/stdtypes.html#mapping-types-dict

2
hwhite4

次の例を考えてください。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_param='F', bar_param='B'}をFooに転送します。その後、入力パラメーターはそのインターフェイスを尊重しないため、FooはTypeErrorを発生させます。

popへの呼び出しを実行する前にsuperbar_paramを実行すると、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
2
ssoler