作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望我的用户能够在命令行上以 Python 语法输入算术表达式,并在运行时将变量名称替换为值。我不想只使用 eval
,我想使用 Abstract Syntax Trees .
例如,假设我想用值 3.5
重写 AST 中的每个变量,然后对其求值。通过阅读文档,我想到了这一点。
import ast
class RewriteName(ast.NodeTransformer):
def visit_Name(self, node):
return ast.copy_location(ast.Num(n=3.5, ctx=node.ctx), node)
tree = ast.parse('a + b', 'eval')
tree = RewriteName().visit(tree)
ast.fix_missing_locations(tree)
o = compile(tree, '<string>', 'eval')
print(eval(o))
我希望打印 7.0
但我收到以下错误。
o = compile(tree, '<string>', 'eval')
TypeError: expected Expression node, got Module
我理解 AST 关于 Expression
和 Expr
的命名法令人困惑,但我还没有找到如何对此进行排序的示例。我尝试了 compile
的各种参数,包括在 tree
的各个子节点上运行它,认为其中之一可能是我需要的表达式,但到目前为止没有成功。
实现此功能的示例代码是什么?
最佳答案
我使用错误的参数调用 ast.parse
。正确的调用方式是
tree = ast.parse('a+b', '', eval)
(请参阅上面的评论。)
关于python - 如何用 Python AST 中的值替换变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55581163/
我是一名优秀的程序员,十分优秀!