@set_ev_cls(event.EventSwitchRequest) 和 @set_ev_cls(event.EventLinkRequest) 在Python中的含义
我正在试着理解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这个装饰器来实现的。