我总是对在任何语言中使用 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 效果更好。
