ray88’s diary

お仕事で困ったとき用の自分用の覚書

Python サブジェネレータを利用する

python 目次 - ray88’s diary
Python イテレータとジェネレータ - ray88’s diary
Python ジェネレータ式の実用例 - ray88’s diary
サブジェネレータとは
サブジェネレータとは、ジェネレータの中で別のジェネレータやイテレータから値を取り出して返す仕組みです。
yield from を使うことで、複数のデータソースをまとめて1つの流れとして処理できます。
【基本の書式】
呼び出されれる側のコード(subgenerator.py に記載)

def main_gen(n):
    yield "start"
    yield from range(n, 0, -1)  # 4,3, 2, 1
    yield from "abc"            # 'a', 'b', 'c'
    yield from [10, 20, 30]     # 10, 20, 30
    yield from sub_gen()        # 'X', 'Y', 'Z'
    yield "end"

#サブジェネレータ
def sub_gen():
    yield "X"
    yield "Y"
    yield "Z"

呼び出し元のコード(main.pyに記載)

import subgenerator
gen = subgenerator.main_gen(4)
print(list(gen))

出力結果

【実務での使用例】

# 複数のログファイルを1つのストリームとして処理
def read_all_logs(log_files):
    for filepath in log_files:
        with open(filepath) as f:
            yield from f  # 各ファイルの全行を順番に返す

# 使う
logs = ['system.log', 'error.log', 'access.log']
for line in read_all_logs(logs):
    if 'ERROR' in line:
        print(line)