import re
def replace_params(code_str):
def param_replacer(match):
params = match.group(1).split(',')
new_params = []
for i, param in enumerate(params, start=1):
new_param = f'param{i}'
new_params.append(new_param)
return f'def {match.group(2)}({", ".join(new_params)}):'
new_code_str, count = re.subn(r'def\s+(\w+)\((.*?)\):', param_replacer, code_str, flags=re.DOTALL)
return new_code_str, count
code = '''
def add(a, b):
return a + b
def subtract(c, d):
return c - d
'''
new_code, replaced_count = replace_params(code)
print(new_code)
print(f"替换次数: {replaced_count}")
代码设计考量
- 正则表达式匹配:使用
re
模块的 re.subn
函数来匹配函数定义。re.DOTALL
标志使得 .
可以匹配包括换行符在内的所有字符,这样能处理函数定义跨多行的情况。正则表达式 def\s+(\w+)\((.*?)\):
可以匹配函数定义的部分,其中 (\w+)
捕获函数名,(.*?)
捕获参数列表。
- 参数替换逻辑:在
param_replacer
函数中,对捕获到的参数列表进行分割,然后逐个替换为带有特定前缀和序号的新参数名。
- 返回结果:
re.subn
函数不仅返回替换后的字符串,还返回替换的次数,这样可以知道有多少个函数定义被处理。
sub和subn在该场景下选择的依据
sub
:sub
函数只返回替换后的字符串,如果我们只关心替换后的代码内容,不关心替换的次数,可以使用 sub
。
subn
:subn
函数除了返回替换后的字符串,还返回替换的次数。在本场景中,如果需要知道有多少个函数定义的参数被替换,使用 subn
更合适,因为可以方便地获取这个替换次数信息,用于后续可能的统计或验证。