【发布时间】:2014-04-29 18:53:31
【问题描述】:
我正在一个 python-twisted 框架中监控一个布尔值。当布尔值更改时,我只想执行一次函数。这可以在 Python 中完成吗?
我正在从 IO 设备串行提取布尔值。在某个时间间隔内轮询该值。当值发生变化时,我想执行一个函数。
【问题讨论】:
-
你问的是如何实现一个只执行一次的函数?或者如何监控某个布尔变量的值?
我正在一个 python-twisted 框架中监控一个布尔值。当布尔值更改时,我只想执行一次函数。这可以在 Python 中完成吗?
我正在从 IO 设备串行提取布尔值。在某个时间间隔内轮询该值。当值发生变化时,我想执行一个函数。
【问题讨论】:
使用类比使用全局更好。
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.
【讨论】:
边沿触发只需要记住之前的值。
_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
而且,很明显,这可以在类中实现,而不是使用全局。
【讨论】: