在使用math
或sin
之类的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
我是否必须手动添加所有数学函数,还是有更简单的方法来做到这一点?
答案 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