您遇到的问题是在调用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