如何在python中实现capl语言里的回调函数(推荐)

CAPL:回调函数

CAPL是一种程序语言,其中程序块的执行由事件控制。 这些程序块被称为事件程序。在事件程序中定义的程序代码在事件发生时执行。换句话说,事件程序就是事件函数,当事件函数关联的事件被触发时,会自动执行此事件函数函数体。事件函数也称为回调函数

事件函数的标志就是关键字on,比如:

  • on key 表示当键盘按下小写字母a时触发此事件函数执行
  • on message 表示当接收到消息时触发此事件函数执行
  • on start 表示当canoe软件运行时触发此事件函数执行
  • on sysvar 表示系统变量值发生改变时触发此事件函数执行

还有很多此类函数,你可以通过在capl文件的左侧的导航栏里右击插入不同类型的事件函数

事件函数的作用是什么?

就是在程序运行期间,可以随时监控某种事件的发生,执行对应的操作。比如你想在can总线上监测收到can消息0x11时获取can消息数据,就可以使用on message 0x11

on message 0x11
{
  byte msg_bytes[8];
  int i;
  for(i=0;i<8;i++)
  {
    msg_bytes[i] = this.byte(i);
  }
}  

那为什么把它称为回调函数呢?

可能是虽然主程序里的代码在从上往下按顺序在执行,但是在这期间只要触发事件函数的条件发生改变,就会“回头”执行事件函数。当然,主程序和事件函数是异步执行

这里有一些注意事项:

Simulation Setup仿真界面插入的Network Node网络节点,加载的capl脚本是没有主程序MainTest的

Test Modules和Test Units加载的capl脚本,是不允许使用system类型的事件函数的

Python:回调函数

python执行回调函数,是在调用某个函数时,把回调函数指针当作参数传入要调用的函数中,在函数内部调用回调函数

def OnEvent_1():
    print("callback up")

def TriggerFunc(fn):
    fn()

if __name__ == "__main__":
    TriggerFunc(OnEvent_1)

在执行TriggerFunc()时,通过传入OnEvent_1()函数指针作为参数,在TriggerFunc()函数体内部调用OnEvent_1()实现回调

所以,OnEvent_1()函数是回调函数,执行TriggerFunc()函数就可以看作触发回调函数的条件

这里有两个注意点:

函数指针是指向函数的指针变量,用函数名表示,不能有括号“()”

调用函数时函数名必须有括号“()”才能调用

capl中的事件函数,有几个特点:

  • 函数体和触发条件定义明确
  • 无限循环监测触发条件是否触发
  • 和主函数异步执行

所以在python中想实现这些特点,可以这样:

import time
import threading

def OnEvent_1(): # 事件函数1
    print("OnEvent_1 up")

def OnEvent_2(): # 事件函数2
    print("OnEvent_2 up")

class RegistEvents(): # 全局变量,存入事件函数指针和对应的触发条件
    registEvents = {} # 存入key:value,key是事件函数指针,value是触发此事件函数的条件

def TriggerFunc(): # 异步函数,用来监测触发条件是否触发,如果触发就执行对应的函数
    currentRegistEvents = {} # 当前的事件和对应条件存入这里
    for event in RegistEvents.registEvents.keys():
        currentRegistEvents[event] = RegistEvents.registEvents[event]
    while True:
        time.sleep(0.01)
        for event in RegistEvents.registEvents.keys():
            if currentRegistEvents[event] != RegistEvents.registEvents[event]:
                event()
                currentRegistEvents[event] = RegistEvents.registEvents[event]

if __name__ == "__main__":
    RegistEvents.registEvents[OnEvent_1] = 0 # 对事件函数OnEvent_1和它的条件进行委托
    RegistEvents.registEvents[OnEvent_2] = 0 # 对事件函数OnEvent_2和它的条件进行委托
    t = threading.Thread(target = TriggerFunc) # 对监测触发条件的函数创建线程,异步执行
    t.start()
    time.sleep(1)
    RegistEvents.registEvents[OnEvent_1] = 1 # 触发条件本来是0,现在设置为1
    RegistEvents.registEvents[OnEvent_2] = 1
    time.sleep(1)
    RegistEvents.registEvents[OnEvent_1] = 2 # 触发条件本来是1,现在设置为2
    RegistEvents.registEvents[OnEvent_2] = 2

由于python中并没有像capl中那样对不同类型触发的事件函数进行定义(on key/on message等),所以这里我们可以借鉴c sharp语言中的委托,定义委托,然后注册事件,最后执行

这里用一个字典来注册(存入)事件和对应的触发条件,key是事件函数指针,value是触发条件(其实是事件函数指针关联的一个值)

为什么不是key是触发条件,value是函数指针呢?

因为事件函数的触发条件需要改变,而字典中的key写入后是无法改变的,但是value是可以改变的,所以value作为触发条件会更好

到此这篇关于如何在python中实现capl语言里的回调函数的文章就介绍到这了,更多相关python回调函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python回调函数用法实例分析

    本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕 才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它 的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密

  • 彻底弄懂Python中的回调函数(callback)

    目录 摘要 什么是回调函数 回调机制的优势 异步处理有关的回调函数 使用一个绑定方法来代替这个简单函数. 使用闭包代替上面的类来实现 使用协程来完成异步操作 总结 摘要 主要是介绍python 的回调函数callback. 什么是回调函数 当程序运行是,一般情况下,应用程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函数(callback function). 例如: 有一家旅馆提

  • python回调函数中使用多线程的方法

    下面的demo是根据需求写的简单测试脚本 #!/usr/bin/env python # coding: utf-8 # 第一个列表为依赖组件和版本号,后面紧跟负责人名称 # 接着出现第二个以来组建列表,负责人为空了 # 所以根据需求需要对组件.版本号.负责人进行不同处理 # 这时在for循环中根据if判断,写回调函数处理 # 格式不一致数据的测试数据 a = [[u'tool-1', u'1.9.13'], u'xiaowang', u'xiaoqu', [u'tool-2', u'1.9.2

  • python回调函数的使用方法

    有两种类型的回调函数: 复制代码 代码如下: blocking callbacks (also known as synchronous callbacks or just callbacks)deferred callbacks (also known as asynchronous callbacks) 那么,在python中如何实现回调函数呢,看代码: 复制代码 代码如下: def my_callback(input):    print "function my_callback was

  • python构建自定义回调函数详解

    回调函数用起来比较爽.特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢 下面贴一个我写的例子 class BaseHandler(object): def crawl(self, url, **kwargs): if kwargs.get('callback'): callback = kwargs['callback'] if isinstance(callback, basestring) and hasattr(self, callback): fun

  • python在回调函数中获取返回值的方法

    python中有用到回调函数的时候,而回调函数又需要返回数值的时候,就需要先将所被传为回调函数的函数先赋值给一个变量,然后等回调结束之后,将这个变量取值回来就可以了. 如我用到到的调用xmlreader时,传入的一个函数需要取回返回值的代码: # 创建一个 XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) #

  • Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 二.什么是回调: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用

  • 如何在python中实现capl语言里的回调函数(推荐)

    CAPL:回调函数 CAPL是一种程序语言,其中程序块的执行由事件控制. 这些程序块被称为事件程序.在事件程序中定义的程序代码在事件发生时执行.换句话说,事件程序就是事件函数,当事件函数关联的事件被触发时,会自动执行此事件函数函数体.事件函数也称为回调函数 事件函数的标志就是关键字on,比如: on key 表示当键盘按下小写字母a时触发此事件函数执行 on message 表示当接收到消息时触发此事件函数执行 on start 表示当canoe软件运行时触发此事件函数执行 on sysvar

  • 详解如何在python中读写和存储matlab的数据文件(*.mat)

    背景 在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果.所以某些matlab从图片处理得到的label信息都会以.mat文件供python读取,同时也python产生的结果信息也需要matlab来做进一步的处理(当然也可以使用txt,不嫌麻烦自己处理结构信息). 介绍 matlab和python间的数据传输一般是基于matlab的文件格式.mat,pytho

  • 如何在python中实现线性回归

    线性回归是基本的统计和机器学习技术之一.经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需要用到线性模型.建议先学习它,然后再尝试更复杂的方法. 本文主要介绍如何逐步在Python中实现线性回归.而至于线性回归的数学推导.线性回归具体怎样工作,参数选择如何改进回归模型将在以后说明. 回归 回归分析是统计和机器学习中最重要的领域之一.有许多可用的回归方法.线性回归就是其中之一.而线性回归可能是最重要且使用最广泛的回归技术之一.这是最简单的回归方法之

  • 分析如何在Python中解析和修改XML

    目录 一.什么是XML? 二.Python XML解析模块 2.1.xml.etree.ElementTree模块 2.2.xml.dom.minidom模块 一.什么是XML? XML代表可扩展标记语言.它在外观上类似于HTML,但XML用于数据表示,而HTML用于定义正在使用的数据.XML专门设计用于在客户端和服务器之间来回发送和接收数据.看看下面的例子: 例子: <? xml version ="1.0" encoding ="UTF-8" ?>

  • 如何在python 中导入 package

    package 在 python 中,是一种有效组织代码,module 可以是一个文件,可以通过 import 来导入一个 module 单个文件,而 package 则是作为一个目录来导入.随后我们还会看一看多层嵌套是如何导入的. >>> import collections,socket >>> print(collections.__path__) ['/anaconda3/envs/py38/lib/python3.8/collections'] >>

  • 如何在Python中编写接口和请求外部接口

    目录 一.引入requests库 二.Get请求 三.Post请求 1.以form表单提交的方式 2.以json字符串的格式来提交 3.文件上传 四.总结 一.引入requests库 Python是通过requests库来请求接口的,所以,首先需要通过pip安装requests库. pip install requests==2.21.0 #文件上传才会用 pip install requests-toolbelt==0.9.1 说明:本文编写的接口用到的是Flask框架关于Flask框架的使用

  • 如何在python中实现随机选择

    这篇文章主要介绍了如何在python中实现随机选择,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 想从一个序列中随机抽取若干元素,或者想生成几个随机数. random 模块有大量的函数用来产生随机数和随机选择元素.比如,要想从一个序列中随机的抽取一个元素,可以使用random.choice() : >>> import random >>> values = [1, 2, 3, 4, 5, 6] >>>

  • 如何在python中写hive脚本

    这篇文章主要介绍了如何在python中写hive脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.直接执行.sql脚本 import numpy as np import pandas as pd import lightgbm as lgb from pandas import DataFrame from sklearn.model_selection import train_test_split from io import St

  • 如何在python中判断变量的类型

    python的数据类型有:数字(int).浮点(float).字符串(str),列表(list).元组(tuple).字典(dict).集合(set) 一般通过以下方法进行判断: 1.isinstance(参数1,参数2) 描述:该函数用来判断一个变量(参数1)是否是已知的变量类型(参数2) 类似于type() 参数1:变量 参数2:可以是直接或间接类名.基本类型或者由它们组成的元组. 返回值: 如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False 例子:

  • 如何在Python中创建二叉树

    前言 本文的内容是数据结构中二叉树部分最基础的,之所以写一下主要是为了方便刷题的时候,能够在自己电脑上很快的使用这种小的demo进行复杂的练习. 二叉树节点定义 二叉树的节点定义如下: class TreeNode():#二叉树节点 def __init__(self,val,lchild=None,rchild=None): self.val=val #二叉树的节点值 self.lchild=lchild #左孩子 self.rchild=rchild #右孩子 递归构建二叉树 本文使用的前序

随机推荐