Python中使用eval语法调用三角函数失败的问题咨询
问题解决方法
你的代码无法运行是因为eval的全局命名空间里只传入了x,表达式中用到的math模块找不到对应引用。以下是两种可行的修正方案:
方案一:将math模块加入全局命名空间字典
把math模块也放进传入eval的全局字典中,让表达式能正常调用:
import math # 这里的expr可以替换为用户输入的含x的代数表达式 expr = "math.sin(x)" result = eval(expr, {'math': math, 'x': 2}) print(result)
方案二:用局部命名空间分离变量(更安全)
如果想限制用户表达式的访问范围,避免暴露整个math模块或内置函数,可以使用eval的第三个参数作为局部命名空间:
import math # 用户输入的表达式直接写sin,无需前缀math. expr = "sin(x)" # 限制内置函数访问,只传入需要的变量和函数 result = eval(expr, {'__builtins__': None}, {'x': 2, 'sin': math.sin}) print(result)
这种方式能降低恶意输入带来的安全风险,后续要支持更多数学函数(比如cos、sqrt),直接把对应的math.cos、math.sqrt加到局部字典即可。
内容的提问来源于stack exchange,提问作者Ronald Rosete
相关产品推荐
相关产品推荐

