如何从库中调用标有装饰器的函数?

How do I call a function from my library that is marked with a decorator?

提问人: 提问时间:8/18/2023 更新时间:8/18/2023 访问量:17

问:

库如何调用标有装饰器的函数? 例:

@client.event
async def on_ready():
   print(f'{client.user} has connected to Discord!')

这是如何在库内实现的? 我试着做点什么,但我认为有一种更简单的方法。

def None_type():
    pass

on_connect_var = None_type


def on_connect(func):
    global on_connect_var
    on_connect_var = func

...
on_connect_var()
...
@event_manager.on_connect
def on_connect():
    print("Connected!")

如何让它更容易?

python-3.x 事件 装饰器 python-decorators

评论

0赞 Barmar 8/18/2023
这基本上就是它的结构。但是,它不是设置全局变量,而是将函数存储在实例的属性中。client
0赞 Barmar 8/18/2023
你认为它能变得容易多少?装饰器只有 2 行代码。

答:

0赞 C. McCracken 8/18/2023 #1

这可能有助于解释装饰器如何比我在这里做得更好:https://henryiii.github.io/level-up-your-python/notebooks/2.3%20Decorators.html

这个想法是装饰器使用函数组合,你有一个函数返回另一个函数(这里),你用它来装饰另一个函数(这里)。在您的示例中,client.eventon_ready

@client.event
async def on_ready():
   print(f'{client.user} has connected to Discord!')

当你以后打电话时,你真的在打电话on_ready()client.event(on_ready)()

不太确定如何使您的特定示例“更容易”,但希望这能回答装饰器如何工作的问题?

评论

0赞 8/18/2023
我知道装饰器是如何工作的,只是如何使用它们制作事件,就像在示例中一样,这就是我问的