🍣

yield 関数を呼び出す (`yield from`)

2022/06/26に公開

yield 関数を呼び出す

yeild で値を返す関数を複数呼び出して一つの yield 関数にしたい場合、

yield 関数() としても期待通り動作しない。

このような場合 yield from を使う

https://docs.python.org/ja/3/whatsnew/3.3.html#pep-380-syntax-for-delegating-to-a-subgenerator

具体例

https://zenn.dev/mtmatma/articles/8203a98ab96a42

で parameterized テストの値を関数で返すテストを作ったが、複数の関数の結果を合わせて一つのテストパラメータとしたいことがある。こういう場合、子関数を yield from で呼ぶことにより、複数の関数の結果をまとめてテストすることができ。

import pytest

def dynamic_params_dayofweek():
    for i in range(3):
        for j in ["Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"]:
            yield pytest.param(i, j, id=f"{i}-{j}-dayofweek")

def dynamic_params_month():
    for i in range(3):
        for j in ["Jar", "Feb", "Mar"]:
            yield pytest.param(i, j, id=f"{i}-{j}-Month")


def dynamic_params_all():
    '''
    yield from がポイント
    '''
    yield from dynamic_params_dayofweek()
    yield from dynamic_params_month()

@pytest.mark.parametrize("i, j, ", dynamic_params_all())
def test_dynamic_params_all(i, j):
    print(i, j)

Discussion