Skip to main content
 首页 » 编程设计

python之安全使用 eval() 或替代方法之python

2025年05月04日11Terrylee

我总是对在任何语言中使用 eval 感到厌倦,但我想不出更好的方法来做两件事。从我读过的所有内容来看,evAl 是邪恶的(那很糟糕)。任何想法表示赞赏。 我有一个带有字典的模块,该字典可以调用函数或设置属性,具体取决于您如何从另一个模块调用它

module Config 
some_dict = {1: ["desc 1", "callfunction1()"],  
  2: ["desc2", "setattr(object, "attribute", "the fun things"]}  

等等

module other 
try: 
  i = int(input()) 
  eval(Config.some_dict[i][1]) 
except ValueError: 
  print("nope") 

我只是想知道是否有更安全的方法来做到这一点。
另外,如果我在程序运行时尝试调试:

try: 
  eval(input()) 
except: 
  pass 

这是可以接受的还是 pythonic 的,还是有更好的方法?我是 python 的新手(我主要运行 JSL,所以一切都是用 eval(parse()) 完成的。

请您参考如下方法:

有一个更好的方法:使用一等函数。

def func2(): 
    setattr(object, "attribute", "the fun things") 
 
some_dict = { 
    1: ["desc 1", callfunction1], 
    2: ["desc2", func2] 
} 
 
i = int(input()) 
Config.some_dict[i][1]() 

使用 lambda 或 partial 可以减少困惑,如果您对它们感到满意的话。 也就是说,您现有的解决方案并不像 eval 的许多用途那样糟糕,因为它不评估任意用户输入,而是评估硬编码字符串。这显然是不必要的、非常缓慢且丑陋的。

对于调试,有专门的调试器。它们比临时的 eval-loop 效果更好。