@set_ev_cls(event.EventSwitchRequest) 和 @set_ev_cls(event.EventLinkRequest) 在Python中的含义

2 投票
2 回答
2392 浏览
提问于 2025-04-18 02:54

我正在试着理解Python中的两个函数。这段代码来自于ryu这个开源控制器。我怀疑它可能实现了LLDP,并试图存储拓扑信息。我不太明白

 @set_ev_cls(event.EventSwitchRequest)

@set_ev_cls(event.EventLinkRequest)

上面的语句在Python中是什么意思。如果有人能解释一下那就太好了。整个文件在这里提供。链接到Python源文件

 @set_ev_cls(event.EventSwitchRequest)
    def switch_request_handler(self, req):
        # LOG.debug(req)
        dpid = req.dpid

        switches = []
        if dpid is None:
            # reply all list
            for dp in self.dps.itervalues():
                switches.append(self._get_switch(dp.id))
        elif dpid in self.dps:
            switches.append(self._get_switch(dpid))

        rep = event.EventSwitchReply(req.src, switches)
        self.reply_to_request(req, rep)

    @set_ev_cls(event.EventLinkRequest)
    def link_request_handler(self, req):
        # LOG.debug(req)
        dpid = req.dpid

        if dpid is None:
            links = self.links
        else:
            links = [link for link in self.links if link.src.dpid == dpid]
        rep = event.EventLinkReply(req.src, dpid, links)
        self.reply_to_request(req, rep)

2 个回答

0

@set_event_cls(event.*) 这一行是 Python 装饰器。网上有很多关于它们的 资料,所以我在这里就不详细解释了。

在这个例子中,它们被用来注册网络事件的回调函数。简单来说,set_event_cls 装饰器把某个函数(比如 switch_request_handler)和一个事件类(比如 event.EventSwitchRequest)关联起来。这样,当 Ryu 收到一个 EventSwitchRequest 时,就会调用 switch_request_handler,并把请求作为参数 req 传进去。

实际的装饰器函数 set_event_cls() 定义在 handler.py 文件中。

0

观察事件: 一个Ryu应用可以通过提供一个处理方法,来注册自己对某种特定事件的关注,这个处理方法是通过使用ryu.controller.handler.set_ev_cls这个装饰器来实现的。

访问: http://ryu.readthedocs.org/en/latest/ryu_app_api.html

撰写回答