【问题标题】:Python One-Shot, level-trigger, edge-triggerPython One-Shot、电平触发、边沿触发
【发布时间】:2014-04-29 18:53:31
【问题描述】:

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

我正在从 IO 设备串行提取布尔值。在某个时间间隔内轮询该值。当值发生变化时,我想执行一个函数。

【问题讨论】:

  • 你问的是如何实现一个只执行一次的函数?或者如何监控某个布尔变量的值?

标签: python twisted


【解决方案1】:

使用类比使用全局更好。

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 - 5 年后我们来到了这里,通过一些轻微的修改,我能够使用这个类来监控一个标志数字输入,该输入触发了从模拟输入的数据收集。这个 EdgeTrigger 类帮助很大。谢谢!
【解决方案2】:

边沿触发只需要记住之前的值。

_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

而且,很明显,这可以在类中实现,而不是使用全局。

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多