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

2024-10-03 17:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以尝试除了使用eval本身,但我想在列表理解或{}中使用它:

[eval(x) if isevaluable(x) else x for x in some_list]

我的目的是: 我从系统argv-其中可以是int\float\内置常量(尤其是True、False、None)。我想用一种简单而干净的方式来铸造它们。在

[注意:安全评估不是这里的问题(即使确实建议这样做)]


Tags: in目的列表forif系统evalsome
2条回答

一个明显的解决方案,可能对您的特定eval字符串有效,也可能不起作用。在

def isevaluable(s):
    try:
        compile(s, "bogusfile.py", "exec")
        return True
    except:
        return False

这将编译代码,检查语法错误等。 不会捕捉到你所有的逻辑问题,但它会检查程序问题,然后再射击到eval,这可能会导致各种各样的麻烦。在

我想做的是:

^{pr2}$

但请记住,您将执行字符串,这可能会使您的结果模糊,并将其放入列表中。
例如,如果您的字符串是rm /tmp/cache.txt,这将在您的isevaluable中得到一个正结果,[eval(x) ...]中得到一个负结果,因为它在try语句中被删除了。在

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

首先,如果您的x只包含类型为string、numbers、tuples、list、dicts、boolean和None的文本,那么可以使用^{},它比eval()函数安全得多。在

ast.literal_eval(node_or_string)

Safely evaluate an expression node or a Unicode or Latin-1 encoded string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

另外,您很可能必须自己定义函数isevaluatable(),例如-

def isevaluatable(s):
    import ast
    try:
        ast.literal_eval(s)
        return True
    except ValueError:
        return False

那你就可以了

导入ast [ast.literal_评估(x) 如果IsEvaluable(x)else x for x in some\u list]

更简单的方法是让函数返回所需的值

^{pr2}$

然后做-

[myeval(x) for x in some_list]

相关问题 更多 >