Python One-Shot,水平触发,边缘触发

时间:2014-04-29 18:53:32

标签: python twisted

我在python-twisted框架中监视一个布尔值。当布尔值改变时,我想只执行一次函数。可以用Python完成吗?

我正在从IO设备中连续拉出布尔值。在某个时间间隔内轮询该值。当值改变时,我想执行一个函数。

2 个答案:

答案 0 :(得分:2)

最好使用类而不是全局变量。

class EdgeTrigger(object):
    def __init__(self, callback):
        self.value = None
        self.callback = callback

    def __call__(self, value):
        if value != self.value:
            self.callback(self.value, value)
        self.value = value

要使用此代码,请使用应调用的函数创建一个对象:

def my_callback(oldVal, newVal):
    print "Value changed from {0} to {1}.".format(oldVal, newVal)

detector = EdgeTrigger(my_callback)

然后"打电话"你得到每个新值的对象:

with open("infile.txt") as f:
    for line in f:
        detector(line.strip())

这将读取文件中的行,并在两个连续行不相同时打印消息。

$ cat infile.txt 
1
1
1
2
2
1

1
2
2
5
$ python edgedetect.py
Value changed from None to 1.
Value changed from 1 to 2.
Value changed from 2 to 1.
Value changed from 1 to .
Value changed from  to 1.
Value changed from 1 to 2.
Value changed from 2 to 5.

答案 1 :(得分:0)

边缘触发只需要记住以前的值。

_prev_value = False
def check_value(val):
    global _prev_value
    change = None
    if val and not _prev_value:
        change = 'up'
    elif _prev_value and not val:
        change = 'down'
    _prev_value = val
    return change

显然,这可以在一个类中实现,而不是使用全局。