如何正确解释单行python代码?

Chi*_*nke 6 python command-line interpreter eval python-3.x

我需要执行一行由用户输入的python代码.如果它是一个语句我想执行它,但如果它是一个表达式,我希望返回结果并用它做一些奇特的东西.问题是python有两个不同的功能,即execeval.

目前我只是尝试评估用户输入的字符串.如果这引发了一个SyntaxError,这可能表明该字符串是一个语句,所以我尝试执行它.

try:
    result = eval(command, scope)
except SyntaxError:
    # Probably command is a statement, not an expression
    try:
        exec(command, scope)
    except Exception as e:
        return command + ' : ' + str(e)
except Exception as e:
    return command + ' : ' + str(e)
else:
    pass # Some fancy stuff
Run Code Online (Sandbox Code Playgroud)

这感觉相当hacky.是否有更整洁,更pythonic的方式来做到这一点?

Blc*_*ght 4

虽然我认为您现有的代码可能相当Pythonic(根据“请求宽恕比请求许可更容易”的原则),但我怀疑最好的替代方法是使用该ast模块来检查字符串中的代码:

tree = ast.parse(some_input_string)
if len(tree.body) == 1 and isinstance(tree.body[0], ast.Expr):
    result = eval(some_input_string, scope)
else:
    exec(some_input_string, scope)
    result = None
Run Code Online (Sandbox Code Playgroud)

请注意,一些常见语句实际上是“表达式语句”。因此,像这样的输入字符串'do_stuff("args")'将使用eval上面代码的分支,而不是exec分支。我不认为这会产生任何不良后果,但你永远不知道。

也可以编译tree已解析的 ,然后将结果传递给稍后的evalorexec调用。我发现它相当繁琐(你需要将ast.Exprsvalue属性包装在ast.Expression顶部分支中),所以我选择了更简单(易于阅读和理解)的替代方案,只需传入字符串并让 Python 解析它再次。