如何使用 AST 根据规则集重命名所有变量

Fra*_*fer 1 python abstract-syntax-tree

是否有一种工具能够迭代 Python 文件中的所有变量和函数参数并根据样式规则替换它们?例如,给定一个函数myModule.py

def myFunc(Variable):
    Tmp = sin(Variable)
    return Tmp * 2
Run Code Online (Sandbox Code Playgroud)

是否有一个工具可以通过如下方式调用

> tool myModule.py --variable-begin-with-lowercase

产生下面的结果?

def myFunc(variable):
    tmp = sin(variable)
    return tmp * 2
Run Code Online (Sandbox Code Playgroud)

我想,该工具应该警告干扰现有变量的重命名。

Aja*_*234 6

You can use ast.NodeTransformer:

import ast

class toLower(ast.NodeTransformer):
    def visit_arg(self, node):
        return ast.arg(**{**node.__dict__, 'arg':node.arg.lower()})

    def visit_Name(self, node):
        return ast.Name(**{**node.__dict__, 'id':node.id.lower()})

code = """
def myFunc(Variable):
    Tmp = sin(Variable)
    return Tmp * 2
"""
new_code = ast.unparse(toLower().visit(ast.parse(code)))
print(new_code)
Run Code Online (Sandbox Code Playgroud)

Output:

def myFunc(variable):
    tmp = sin(variable)
    return tmp * 2
Run Code Online (Sandbox Code Playgroud)