我知道我可以 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 不是这里的问题(即使确实推荐)]
一个明显的解决方案可能适用于您的特定评估字符串,也可能不适用于您的特定评估字符串。
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()是一个更好的选择。在任何例子中都可能是这样。
| 归档时间: |
|
| 查看次数: |
5055 次 |
| 最近记录: |