gpt4 book ai didi

python - 使用 exec() 动态调用异步函数

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:18 26 4
gpt4 key购买 nike

所以,我正在使用discord.py 实现一个Discord Bot,并且我正在尝试根据命令动态调用函数。我能够使用 exec() 很好地测试动态函数调用,但它们似乎与 Discord.py 所需的异步调用分崩离析。

因此,我在此示例中尝试执行的操作是调用 hello 函数,并通过在聊天中键入 !hello 将 Hello World 打印到不和谐中。

@client.event
async def on_message(message):
call = 'await ' + message.content.lower()[1:] + '(message)'
exec(call)

async def hello(message):
await client.send_message(message.channel, 'Hello World')

不幸的是,这段代码似乎没有做任何事情,我假设是因为 exec() 处理异步调用的方式。任何帮助将不胜感激。

最佳答案

使用 globals() 代替 exec() 来获取函数:

import asyncio


async def main():
s = "foo"
param = "hello"
coro = globals().get(s)
if coro:
result = await coro(param)
print("got:", result)
else:
print("unknown function:", s)


async def foo(param):
print(param)
await asyncio.sleep(0.11)
return ":-)"


loop = asyncio.get_event_loop()
response = loop.run_until_complete(main())
loop.close()

但是,允许用户访问 globals() 中的任何内容可能会很危险,相反,最好将您的命令列入白名单,例如使用:

import asyncio

my_commands = {}


def register(cmd):
my_commands[cmd.__name__] = cmd
return cmd


async def main():
s = "foo"
param = "hello"
coro = my_commands.get(s)
if coro:
result = await coro(param)
print("got:", result)
else:
print("unknown function:", s)


@register
async def foo(param):
"""I am the mighty foo command!"""
print(param)
await asyncio.sleep(0.11)
return ":-)"



loop = asyncio.get_event_loop()
response = loop.run_until_complete(main())
loop.close()

另请参阅:

for k, v in my_commands.items():
print("{}: {}".format(k, v.__doc__ or "no docs"))

关于python - 使用 exec() 动态调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44726638/

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