如何实现输入命令与函数名匹配时自动调用对应函数 参考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
相关产品推荐
相关产品推荐

