runner()
が返す関数inner()
が呼び出された時点で、random.randint(1,UPPER_BOUND)
が評価されているという問題が発生します。必要なのは、後で評価を延期することです。
あなたはこのような何かを試みることができる:callable
は元の関数f
が呼び出されるたびに呼び出され
>>> def runner(f, callable):
... def inner():
... for i in xrange(1000):
... f(*callable())
... return inner
...
>>> runner(f, lambda: (random.randint(1, 1000),))()
603
385
321
etc.
注こと。また、callable
は、タプルやリストのようなシーケンス型を返さなければならないことにも注意してください。
編集:あなたがf
に他の引数を渡す必要がある場合は、このような何かでそれを行うことができます:あなたは、ループ内random.randit
呼び出しを配置する必要があり
>>> def runner(f, callable):
... def inner(*args, **kwds):
... for i in xrange(1000):
... pos = list(callable())
... pos.extend(args)
... f(*pos, **kwds)
... return inner
...
>>> def f(a, b, c, d = 3):
... print a, b, c, d
...
>>> runner(f, lambda: (random.randint(1,1000),))(3, 5, d = 7)
771 3 5 7
907 3 5 7
265 3 5 7