python抽象语法树中的赋值运算符重载



我想使用抽象语法树在python中动态重载赋值运算符

import ast
import astunparse
class OverloadAssignments(ast.NodeTransformer):
def visit_Assign(self, node):
if isinstance(node, ast.Assign) and node.targets:
funcs = node.targets[0]
slot_name_candidate = astunparse.unparse(funcs).strip()
if isinstance(funcs, ast.Name) and "_slot" in slot_name_candidate:
slot_name = ast.Constant(value=slot_name_candidate)
context_variable = ast.Constant(value=astunparse.unparse(node.value).strip())
return ast.Expr([ast.Call(func=ast.Name(id='copy_variable_value', ctx=ast.Load),
args=[slot_name, context_variable], keywords=[])])
else:
return node
return node
assignment_overloader = OverloadAssignments()
code_chunk = "town_slot=cxt.my_town"
tree = ast.parse(code_chunk)
tree = assignment_overloader.visit(tree)

我使用parseprint函数从这里漂亮地打印代码树结构https://bitbucket.org/takluyver/greentreesnakes/src/master/astpp.py

http://alexleone.blogspot.co.uk/2010/01/python-ast-pretty-printer.html

这给了我的结果

parseprint(tree)
Module(body=[
Expr(value=[
Call(func=Name(id='copy_variable_value', ctx=<class 'ast.Load'>), args=[
Constant(value='town_slot', kind=None),
Constant(value='cxt.my_town', kind=None),
], keywords=[]),
]),
], type_ignores=[])

然后我需要将代码解析为字符串。我用另一个python包:

astunparse.unparse(tree)
AttributeError: 'Unparser' object has no attribute '_str'

其失败。

在这种情况下,是什么导致astunparse失败?

如何正确地解析上面的代码?

我期望astunparse生成以下代码块:

copy_variable_value("town_slot", "cxt.my_town")

您不需要使用astunparseast模块包括一个unparse方法:

import ast
class AssignOverload(ast.NodeTransformer):
def visit_Assign(self, node):
return ast.Call(func=ast.Name(id='copy_variable_value'), 
args=[ast.Constant(value=ast.unparse(i)) for i in [*node.targets, node.value]], 
keywords=[])
code_chunk = "town_slot=cxt.my_town"
a = AssignOverload()
result = a.visit(ast.parse(code_chunk))
print(ast.unparse(result))

输出:

copy_variable_value('town_slot', 'cxt.my_town')

最新更新