python - 如何正确解释一行 python 代码?

标签 python python-3.x command-line eval interpreter

我需要执行用户输入的一行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

这感觉相当hacky。是否有更简洁、更 pythonic 的方法来做到这一点?

最佳答案

虽然我认为您现有的代码可能相当 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

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

也可以编译已解析的,然后将结果传递给稍后的evalexec 调用。不过,我发现做对非常费力(您需要将 ast.Exprvalue 属性包装在 ast.Expression 中top 分支),所以我选择了更简单(便于阅读和理解)的替代方法,即只传入字符串并让 Python 再次解析它。

关于python - 如何正确解释一行 python 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574559/

相关文章:

python - 如何删除lxml中的元素

python - 是否有内置方法从 Python 的所有基类中获取所有 __annotations__?

python - 在 python 中获取给定日期的一年前的日期?

python - 从 Python 中的元组列表中获取配对元素

python - 快速响应的命令行脚本

python - sklearn standardscaler 结果与手动结果不同

python - 从Python中的多个字典返回结果

python - Vanilla Django 转换 ResourceWarning : "unclosed file" on logging

java - 从 Python 运行 Java 程序

mysql - 无法在命令行 Windows 上压缩我的 mysqldump