您遇到的問題是在調用runner()
返回的inner()
函數時正在計算random.randint(1,UPPER_BOUND)
一次。你需要的是延遲評估,直到晚點。
你可以嘗試這樣的事:
>>> 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
被調用時調用。另請注意,callable
必須返回序列類型,如元組或列表。
編輯:如果需要其他參數傳遞給f
你可以像這樣做:
>>> 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