允许 eval() 仅评估算术表达式和某些函数

问题描述 投票:0回答:1

我有一个使用

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()
的方法可以为我做这件事...

python eval
1个回答
0
投票

您可以将全局和本地命名空间作为字典传递给

eval()
。如果全局变量包含
__builtins__
则无法从传递的字符串中调用任何正常的内置函数。您也可以使用它来提供您自己的功能,例如

globs = {
  "__builtins__": {},
  "sqrt": my_sqrt_fun
}

如果你将它传递给 eval 那么输入中的

sqrt
将调用
my_sqrt_fun

eval("3 + sqrt(3)", globs)

通过例如

exec
将引发一个
NameError
,因此无法以这种方式执行任意代码。

© www.soinside.com 2019 - 2024. All rights reserved.