使用python中的数学模块安全地使用eval进行计算

时间:2020-10-31 03:14:04

标签: python eval

在使用mathsin之类的ceil函数的同时,我想从用户输入的字符串中获取计算结果。我也希望能够以sin(30)而不是math.sin(30)的身份进行操作。我以为是

from math import *

可以工作,因为当我全部导入时,它显示为内置函数,并且导入了内置函数。但是,当我运行代码时,它表明数学函数在eval()

内部不起作用
>>> from math import *
>>> sin
<built-in function sin>
>>> print
<built-in function print>
>>> eval("sin(30)", {}, {})
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    eval("sin(30)", {}, {})
  File "<string>", line 1, in <module>
NameError: name 'sin' is not defined

我是否必须手动添加所有数学函数,还是有更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

关于“安全”,这取决于您的意思。您可以轻松地提供对全局环境的访问,使表达式可以访问您导入的任何内容。但是,没有什么可以阻止用户输入可以执行意外操作的表达式的,因此,如果该表达式来自不受信任的用户,则应避免使用eval

话虽如此,您可以使示例工作如下:

>>> from math import *
>>> eval("sin(30)", globals())
-0.9880316240928618
>>> 

请注意,在此示例中,30被解释为弧度而不是度。

答案 1 :(得分:1)

$ echo -e  'import math\nmathok={k: v for k, v in math.__dict__.items() if not k.startswith("__")}\nprint(eval("3*pi",{"__builtins__": {}},mathok))' | python               
9.42477796076938
相关问题