【发布时间】:2020-08-11 06:35:58
【问题描述】:
给定输入:
query = ("class_name", "function_name", "arg_name")
如何将找到的内容替换为其他提供的node?
前阶段的解析示例:
class Foo(object):
def f(self, g: str = "foo"): pass
解析后阶段的例子:
class Foo(object):
def f(self, g: int = 5): pass
给定以下对假设函数的调用:
replace_ast_node(
query=("Foo", "f", "g"),
node=ast.parse("class Foo(object):\n def f(self, g: str = 'foo'): pass"),
# Use `AnnAssign` over `arg`; as `defaults` is higher in the `FunctionDef`
replace_with=AnnAssign(
annotation=Name(ctx=Load(), id="int"),
simple=1,
target=Name(ctx=Store(), id="g"),
value=Constant(kind=None, value=5),
),
)
我已经一起破解了a simple solution for finding a node with the query list,它还有一个额外的好处,那就是为任何事情工作("Foo", "f", "g") 可以引用def Foo(): def f(): def g():,以及从arg 到AnnAssign 的a parser/emitter。但我无法弄清楚这个阶段; ast.NodeTransformer 是否按顺序遍历? - 那么我是否应该不断遍历、附加当前名称并检查当前位置是否是完整的查询字符串? - 我觉得我缺少一些干净的解决方案……
【问题讨论】:
标签: python python-3.x annotations abstract-syntax-tree default-arguments