gpt4 book ai didi

python - 带参数的装饰器

转载 作者:行者123 更新时间:2023-11-28 20:44:18 24 4
gpt4 key购买 nike

你能解释一下下面的装饰器是如何工作的吗:

def set_ev_cls(ev_cls, dispatchers=None):
def _set_ev_cls_dec(handler):
if 'callers' not in dir(handler):
handler.callers = {}
for e in _listify(ev_cls):
handler.callers[e] = _Caller(_listify(dispatchers), e.__module__)
return handler
return _set_ev_cls_dec


@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def _switch_features_handler(self, ev):
datapath = ev.msg.datapath
....

请不要详细说明函数内部发生的事情。我对带有参数的装饰器如何在这里包装方法很感兴趣。顺便说一下,这是Ryu(事件注册机制)的代码片段。

提前致谢

最佳答案

首先,装饰器只是一个被函数调用的函数。特别是,以下内容(几乎)是同一件事:

@spam
def eggs(arg): pass

def eggs(arg): pass
eggs = spam(eggs)

那么,当装饰器带参数时会发生什么?同样的事情:

@spam(arg2)
def eggs(arg): pass

def eggs(arg): pass
eggs = spam(arg2)(eggs)

现在,请注意函数 _set_ev_cls_dec 是一个局部函数,它最终返回并用于代替 _switch_features_handler,它是在装饰器内部定义的。这意味着它可以是来自外部函数的变量的闭包——包括外部函数的参数。因此,它可以在调用时使用 handler 参数,加上它在装饰时获得的 ev_clsdispatchers 参数。

所以:

  • set_ev_cls_dev 创建一个本地函数并围绕其 ev_clsdispatchers 参数返回一个闭包,然后返回该函数。
  • 该闭包以 _switch_features_handler 作为参数调用,它通过添加 callers 属性修改并返回该参数,该属性是 _Caller< 的字典 对象从封闭的 dispatchers 参数构建并关闭封闭的 ev_cls 参数。

关于python - 带参数的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com