您遇到的问题是 random.randint(1,UPPER_BOUND) 在调用 runner() 返回的 inner() 函数时被评估一次。您需要的是将评估推迟到以后。
你可以试试这样的:
>>> 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.
请注意,每次调用原始函数f 时都会调用callable。另请注意,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