我知道我可以在 eval
自身中使用 try-except,但我希望在列表推导或 map
中使用它:
[eval(x) if isevaluable(x) else x for x in some_list]
我这么做的原因是: 我从sys.argv获取参数 - 这些参数可以是int\float\内置常量(特别是True,False,None)。我希望以一种简单清晰的方式将它们全部转换。
[注意:safe-eval在这里不是问题(即使它确实被推荐)]
def isevaluable(s):
try:
compile(s, "bogusfile.py", "exec")
return True
except:
return False
def isevaluable(s):
try:
eval(s)
return True
except:
return False
rm /tmp/cache.txt
,则会在isevaluable
中给出正面结果,在[eval(x) ...]
中给出负面结果,因为它在try语句中被删除了。
在这种情况下,compile()
是更好的选择。在任何示例中,它都很可能是最佳选择。
x
仅包含字符串、数字、元组、列表、字典、布尔值和None类型的文字,你可以使用ast.literal_eval
,这比eval()
函数更安全。
此外,你很可能需要自己定义ast.literal_eval(node_or_string)
安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串、数字、元组、列表、字典、布尔值和None。
isevaluatable()
函数,例如 -def isevaluatable(s):
import ast
try:
ast.literal_eval(s)
return True
except ValueError:
return False
那么你可以这样做
import ast [ast.literal_eval(x) if isevaluatable(x) else x for x in some_list]
更简单的方法是使函数直接返回所需的值
def myeval(s):
import ast
try:
return ast.literal_eval(s)
except ValueError:
return s
[myeval(x) for x in some_list]
ast.literal_eval
不就相当于 eval(x, {}, {})
(globals
和 locals
为空字典)吗? - alikyos
try / except
语句会在该评估实例中删除文件。 - Torxedeval
的可能性非常小。 - jonrsharpeast.literal_eval(string_value)
- Łukasz Rogalski