检查字符串是否可以在 Python 中计算(使用 eval())

ali*_*yos 5 python eval

我知道我可以 try-excepteval本身,但我想在 list_comprehensions 或map

[eval(x) if isevaluable(x) else x for x in some_list]
Run Code Online (Sandbox Code Playgroud)

我这样做的动力是:我从 sys.argv 得到参数 - 它可以是 int\float\built-in-constants(尤其是 True、False、None)。我想以一种简单而干净的方式将它们全部投射出来。

[注意:safe-eval 不是这里的问题(即使确实推荐)]

Tor*_*xed 1

一个明显的解决方案可能适用于您的特定评估字符串,也可能不适用于您的特定评估字符串。

def isevaluable(s):
    try:
        compile(s, "bogusfile.py", "exec")
        return True
    except:
        return False
Run Code Online (Sandbox Code Playgroud)

这会编译代码,检查语法错误等。不会捕获所有逻辑问题,但它会在将其放入 eval 之前检查编程问题,这可能会导致各种麻烦。

我想到这样做:

def isevaluable(s):
    try:
        eval(s)
        return True
    except:
        return False
Run Code Online (Sandbox Code Playgroud)

但请记住,然后您将执行您的字符串,这可能会掩盖您将其放入列表中的结果。
例如,如果您的字符串是rm /tmp/cache.txtwhich ,则会在您的字符串中给出正结果,isevaluable在您的字符串中给出负结果[eval(x) ...],因为它在 try 语句中被删除了。

在这种情况下,compile()是一个更好的选择。在任何例子中都可能是这样。