PythonでJavascriptの様な分割代入
Kazuki Moriyama (森山 和樹)
概要
この記事では、JavaScriptでよく用いられる分割代入のテクニックをPythonでも実装します。分割代入はオブジェクトから好きな引数を取得する方法で、関数型的なプログラムの構築に役立ちます。Pythonにおける分割代入の方法と、辞書から好きなkeyのデータだけを取得する方法について説明します。
pythonの分割代入について
Pythonにおける分割代入は、*
を使用して行います。
配列の分割代入
*
を使って配列の分割代入を行う方法を示します。
def ar_print(*args):
print(args)
a = [1, 2, 3]
ar_print(*a)
# => (1, 2, 3)
配列などのiteratableなオブジェクトの前に*
をつけて、関数に渡すと、タプルとして引数が渡ります。
辞書の分割代入
**
を使って辞書の分割代入を行う方法を示します。
def dic_print(**kwargs):
print(kwargs)
d = {'a': 1, 'b': 2}
dic_print(**d)
# => {'a': 1, 'b': 2}
**
を使用すると、辞書として引数が渡ります。
分割代入を用いた引数の選択
辞書の分割代入とキーワード引数を併用して、特定の引数だけを取得する方法を示します。
def print_a_value(*, a, **rest):
print(a)
return rest
d = {'a': 1, 'b': 2}
rest = print_a_value(**d)
# => 1
print(rest)
# => {'b': 2}
*
の後ろの引数はキーワード引数になります。また、**rest
は可変長引数で、余った辞書の要素がその中に格納されます。このようにして、関数側からデータを選択することができます。
まとめ
JavaScriptでは関数型+オブジェクト指向の特性を持つため、この分割代入のテクニックは頻繁に使用されます。一方で、Pythonのようなオブジェクト指向言語ではあまり辞書ベースのデータ保持オブジェクトを使用しないことが一般的です。しかし、関数型チックな構成を持つ場合には、この分割代入のテクニックを活用してコードをより簡潔に記述することができるかもしれません。