You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现输入命令与函数名匹配时自动调用对应函数 参考discord.py逻辑

实现方案

核心逻辑是在CommandManager内部维护命令名到对应函数的映射表,同时将call_fun改造成支持装饰器注册、命令调用两种场景的逻辑。

修改后的完整ai_main.py代码

class CommandManager:
    def __init__(self, prefix="!"):
        print("INIT")
        self.prefix = prefix
        # 新增命令映射表:key是命令名,value是对应函数
        self.commands = {}

    def run(self):
        user_input = input("Enter command: ")
        self.check_for_command(user_input)

    def check_for_command(self, user_input):
        if not user_input.startswith(self.prefix):
            return
        # 拆分命令名和参数
        parts = user_input[len(self.prefix):].split(maxsplit=1)
        command_name = parts[0]
        args = parts[1].split() if len(parts) > 1 else []
        if command_name:
            self.call_fun(command_name, *args)

    def call_fun(self, *args, **kwargs):
        # 场景1:作为装饰器使用,传入的第一个参数是被装饰的函数
        if len(args) == 1 and callable(args[0]):
            func = args[0]
            # 用函数名作为命令名存入映射表
            self.commands[func.__name__] = func
            return func
        # 场景2:执行命令,传入的第一个参数是命令名
        command_name = args[0]
        command_args = args[1:]
        if command_name in self.commands:
            # 调用对应函数,传入参数
            return self.commands[command_name](*command_args, **kwargs)

效果验证

你现有的main.py代码不需要修改,运行后输入!hello就会自动调用注册的hello函数打印输出hello。
如果需要实现带参数的命令,直接在函数定义中加参数即可,示例如下:

@bot.call_fun
def add(a, b):
    print(int(a) + int(b))

输入!add 3 5就会输出8,和discord.py的命令调用逻辑一致。

内容的提问来源于stack exchange,提问作者colin oneill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:00:00