我有这个助手计时器类:
class RepeatingTimer(object):
def __init__(self, interval, f, *args, **kwargs):
self.args = args
self.interval = interval
self.f = f
self.kwargs = kwargs
self.timer = None
def callback(self):
# The order is so self.f will be able to cancel the timer
self.start()
self.f(*self.args, **self.kwargs)
def cancel(self, timer_id):
self.timer.cancel()
del timers[timer_id]
def start(self):
self.timer = Timer(self.interval, self.callback)
self.timer.start()
我想要的是能够执行一个计时器,例如:
timers = {}
def execute_func(*args, **kwargs):
print("hi")
timer_id = random.random()
timers[timer_id] = RepeatingTimer(1, execute_func)
timers[timer_id].start()
我需要execute_func
中的代码能够停止计时器,事实是我想连接那些计时器执行,例如:
我执行第一个计时器(那3行),每秒计时器执行我运行一些代码,在指定的秒我手动结束计时器并想要执行另一个计时器(那3行)。
换句话说,当第一个计时器完成(手动,通过一些回调)我想启动一个新的计时器时,我已经设法用一个丑陋的回调层次结构来实现它:
main_cb("b1",
lambda timer_id: main_cb("b2",
lambda timer_id: main_cb("b3")))
问题在于我无法迭代["b1", "b2", "b3"]
我必须手动进行丑陋的嵌套。
总结:我正在寻找一种方法,一般方法用一些参数执行相同的函数,其中一个参数应该是done
回调,当被调用时启动下一个迭代器等等。
答案 0 :(得分:1)
您绝对可以遍历该列表以生成嵌套回调:
from functools import partial
def main_cb(arg, next_cb=None):
print(arg)
if next_cb:
next_cb()
callback = None
for b in reversed(['b1', 'b2', 'b3']):
callback = partial(main_cb, b, callback) # (lambda creates a late binding closure bug)
print(callback)
callback()
输出:
functools.partial(<function main_cb at 0x1007c0f28>, 'b1', functools.partial(<function main_cb at 0x1007c0f28>, 'b2', functools.partial(<function main_cb at 0x1007c0f28>, 'b3', None)))
b1
b2
b3