読者です 読者をやめる 読者になる 読者になる

cocuh's note

type(あうとぷっと) -> 駄文

Pythonの無限ジェネレータこわい

Python

ミスで下とおなじようなコードを書いてメモリー食いつぶして死んだ上に、どこが悪いのかパット見わからないのが怖いと思って衝動的に書いた次第であります。

これの気をつけるべきこととしては可変長引数は関数呼び出し前に展開されて実行されるため無限ジェネレータを渡すと無限に展開されてメモリー食いつぶしてMemoryErrorで死にます。一瞬で16GB以上も食いつぶしていくので再帰上限みたいなwarningかlimitかなにかあればいいんですけど。。。

def count(): #itertools.countとほぼ同じ
    c = 0
    while True:
        yield c
        c += 1

def spam(*args): # def spam():でも今回の場合はおなじです。
    pass


gen = count()

spam(*gen) # raise MemoryError

わたしは結構ジェネレータ好きなのでよく使うのですが、こういうのをwebアプリケーションで書いてたらこわいなと思いました。可変長引数つかわないかテスト書くか無限ジェネレータは使わないようにすればいいんですけど。。。うむむ。。。