いろいろ備忘録日記

主に .NET とか Java とか Python絡みのメモを公開しています。

Pythonメモ-92 (PEP-448 Additional Unpacking Generalizations)(アンパック演算子の利用方法拡張, python 3.5で追加)

概要

Python 3.5 で追加された PEP-448 についてのメモ。

www.python.org

元々存在している *** というアンパック演算子の利用方法を拡張するというものです。

便利なので忘れないようにメモメモ。

どんな内容?

以下のケースでの利用方法が拡張されています。

  • 関数呼び出しにて任意の数のアンパックが利用可能になった
  • タプル、リスト、集合、辞書表現でも複数のアンパックが利用可能になった

Python 3.5 のリリースドキュメントのところにわかりやすいサンプルが載っています。

docs.python.org

def f(a, b, c, d):
    pass

f(**{'a':100, 'b':200}, c=300, **{'d':400})
f(*range(2), 2, *range(3, 4))

val = *range(2), 2  # (0, 1, 2)

とか出来るようになっています。便利ですねー。

サンプル

以下、ちょっとしたサンプルです。

"""
* と ** のアンパック演算子についてのサンプルです

PEP484 の動作について

REFERENCES:: http://bit.ly/2VMowpQ
"""
from trypython.common.commoncls import SampleBase
from trypython.common.commonfunc import pr


# noinspection PyMethodMayBeStatic
class Sample(SampleBase):
    def exec(self):
        # -----------------------------------------------------------------------
        # PEP 448 「* イテラブルアンパック演算子と ** 辞書アンパック演算子の利用方法拡張」
        #
        # 1. 関数呼び出しにて任意の数のアンパックが利用可能になった
        # 2. タプル、リスト、集合、辞書表現でも複数のアンパックが利用可能になった
        # -----------------------------------------------------------------------

        # 1
        self.pep448_01(*[1, 2], *[5], 3, *[9, 10])
        self.pep448_02(**{'a': 100, 'b': 200}, c=300, **{'d': 400})
        self.pep448_02(*range(2), 3, *range(3, 4))

        # 2
        r1 = *range(2), 2
        pr('r1', r1)

        r2 = [*range(2), 2, *range(3, 10)]
        pr('r2', r2)

        d1 = {'a': 100, 'b': 200}
        d2 = {'f': 999}
        d3 = {**d1, 'c': 300, 'd': 400, **d2}
        pr('d3', d3)

    def pep448_01(self, *args):
        pr('pep448_01', args)

    def pep448_02(self, a, b, c, d):
        pr('pep448_02', a, b, c, d)


def go():
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

try-python/unpack_pep448.py at master · devlights/try-python · GitHub

結果は以下のようになります。

pep448_01=(1, 2, 5, 3, 9, 10)
pep448_02=100, 200,300,400
pep448_02=0,1,2,3
r1=(0, 1, 2)
r2=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
d3={'a': 100, 'b': 200, 'c': 300, 'd': 400, 'f': 999}

補足情報

アンパック関連のPEPで以前以下のような記事もありました。自分の備忘録ついでにここにメモ。

devlights.hatenablog.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com