我在python-twisted框架中监视一个布尔值。当布尔值改变时,我想只执行一次函数。可以用Python完成吗?
我正在从IO设备中连续拉出布尔值。在某个时间间隔内轮询该值。当值改变时,我想执行一个函数。
答案 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
显然,这可以在一个类中实现,而不是使用全局。