私は両方の方法を見てきましたが、違いが何であり、「ベストプラクティス」として使用すべきものを理解していません。
def custom_function(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...
def custom_function2(**kwargs):
foo = kwargs.get('foo')
bar = kwargs.get('bar')
...
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
違いはpop
もディクショナリからアイテムを削除します。
ベストプラクティスはありません。特定のユースケースにより便利なものを使用してください。
ほとんどの場合、必要なのは値をget
tingすることだけです。
また、余分な/予期しないkwargsが提供されないようにしたい場合もあります。この場合、pop
を使用すると便利です。例えば。:
a = kw.pop('a')
b = kw.pop('b')
if kw:
raise TypeError('Unepxected kwargs provided: %s' % list(kw.keys()))
そのため、get関数とpop関数は非常に異なることを行います
getは、ディクショナリ内の指定されたキーの値を返すために使用されます
popは辞書から値を削除し、削除された値を返します
辞書関数はすべてここに記載されています(python3の場合): https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
次の例を考えてください。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
への呼び出しを実行する前にsuper
bar_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