我有一个使用
eval()
函数计算表达式的计算器,但我知道使用 eval()
是危险的,因为它可以用来在机器上运行任意代码。
所以,我希望它只能计算算术表达式和某些定义的函数(从另一个文件导入)。
consolecalc.py:
from mymathmodule import *
import time
while True:
try:
Choose = '''Choose your function:
1: Percentage calculator
2: Factorial calculator
3: Basic arithmetics (+-*/)
'''
for character in Choose:
print(character, end="", flush=True)
time.sleep(0.006)
a = int(input(':'))
if a == 1:
percentagecalc()
elif a == 2:
factorialcalc()
elif a == 3:
calc = input("Enter Expression:")
print("Expression equals:",eval(calc))
else:
print("\nOops! Error. Try again...")
time.sleep(0.6)
except:
print("\nOops! Error. Try again...")
time.sleep(0.6)
定义的函数存在于mymathmodule.py中,我只希望
eval()
能够评估这些函数以及基本算术表达式
我也想知道是否有任何替代
eval()
的方法可以为我做这件事...
您可以将全局和本地命名空间作为字典传递给
eval()
。如果全局变量包含 __builtins__
则无法从传递的字符串中调用任何正常的内置函数。您也可以使用它来提供您自己的功能,例如
globs = {
"__builtins__": {},
"sqrt": my_sqrt_fun
}
如果你将它传递给 eval 那么输入中的
sqrt
将调用 my_sqrt_fun
eval("3 + sqrt(3)", globs)
通过例如
exec
将引发一个 NameError
,因此无法以这种方式执行任意代码。