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

2024-05-01 21:45:15 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我用不和.py,我尝试根据命令动态调用函数。我可以用exec()很好地测试动态函数调用,但它们似乎与不和.py. 在

所以我在这个例子中要做的是调用hello函数,并通过输入将hello World打印成discord!你好聊天。在

@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()如何处理异步调用。任何帮助都将不胜感激。在


Tags: py命令clientmessagehelloworldasyncdef
1条回答
网友
1楼 · 发布于 2024-05-01 21:45:15

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

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()中的任何内容可能是危险的,相反,最好将命令白名单化,例如使用:

^{pr2}$

另请参见:

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

相关问题 更多 >