You need to enable JavaScript to run this app. discord.py自定义p!math数学命令返回原表达式而非计算结果求助
优惠活动
大模型
产品
解决方案
定价
更多

discord.py自定义p!math数学命令返回原表达式而非计算结果求助

问题根因
  • 现有代码未捕获任何计算结果:exec() 的设计定位是执行多语句代码块,本身不返回表达式的计算值,仅完成逻辑执行流程。当前代码执行完 exec(p) 后,直接将原始输入的字符串 p 作为消息发送内容,最终表现为机器人原样回显用户输入的表达式。
  • 无限制使用 exec() 执行用户输入存在极高安全风险,恶意输入可通过调用系统命令、读取服务器文件等操作直接损毁机器人运行环境。
修正实现
import math

@client.command()
async def math(ctx, *, expression: str):
    # 配置安全求值环境,仅开放数学计算能力,禁用所有危险内置函数
    math_env = {name: getattr(math, name) for name in dir(math)}
    try:
        # 捕获表达式的计算结果,关闭全局作用域、内置函数的访问权限
        calc_result = eval(
            expression,
            {"__builtins__": {}},
            math_env
        )
        await ctx.send(f"计算结果:{calc_result}")
    except Exception as e:
        await ctx.send(f"```python\nError: {e}```")
关键修改说明
  • 替换无返回值的 exec() 为带结果捕获的 eval(),将计算得到的结果作为消息发送内容,不再回显原始输入。
  • 给求值过程添加严格沙箱限制:清空内置函数访问权限,仅暴露数学库提供的计算方法,避免恶意代码注入攻击。
  • 优化参数命名为语义更清晰的 expression,降低代码维护成本。

测试效果:用户输入 p!math 3+13 时,机器人将返回计算结果:16,符合预期。

内容的提问来源于stack exchange,提问作者Nicholas Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:54:03