python

时间:2017-07-23 21:15:26

标签: python timer

我有这个助手计时器类:

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回调,当被调用时启动下一个迭代器等等。

1 个答案:

答案 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