前言
在度申提供的SDK中有一个XML文件,里面详细说明了C#库中各个API接口的功能、参数、返回值
API接口都定义在DVPCamera这个类中,大概有2000多行,200多个接口
思路
由于Python是弱类型的语言,不需要类型定义,于是这就为自动转换提供了方便,观察C#的接口结构,可以将信息分为以下几类:函数功能说明,形参英文变量名,形参中文解释,函数名,返回值中文解释等
我们可以利用正则表达式,分别将这几类信息提取出来,然后放到准备好的Python函数模板中就可以了,Python的函数格式如下,只需要替换某些信息即可:
代码实现
代码如下:
# // X:/软件/C#库调用测试/自动化API生成之完整流程.py
# // Copyright (c) 2023.
# // @Time : 2023/2/14 13:35:44
# // @Author : 张稚琦
# // @Address: 湖北理工学院腾龙公寓 6131
# // @Email : zhang@zhang.mba / zhangzhiqi828@gmail.com / zhangzhiqi@lh83.onmicrosoft.com / 2272358828@qq.com
# // @File : 自动化API生成之完整流程.py
# // @LastModified: 2023/2/14 下午1:35
# // @ProjectName : C#库调用测试
import re
with open('text.txt', 'r', encoding='utf-8') as f:
text = f.read()
sections = text.strip().split('\n\n')
all=""
# 输出结果
for section in sections:
# print(section)
# print('*'*50)
#提取函数名 和 形参列表
pattern = r'(\w+)\s*\((.*?)\);'
match = re.search(pattern, section)
if match:
# 提取函数名和形参变量名
func_name = match.group(1)
params = match.group(2)
# 去除空格和换行符
params = re.sub(r'\s+', '', params)
# 分割形参变量名
param_names = params.split(',')
# print('Function name:', func_name)
# print('Parameter names:', param_names)
# 使用正则表达式提取param标签中的文字
param_list = re.findall(r'<param name=".*?">(.*?)</param>', section, re.DOTALL)
# print(param_list)
# 提取返回值说明
returns = re.findall(r'<returns>(.*?)</returns>', section)
if not returns:
returns=[""]
# print(returns)
#提取para说明
result = re.findall(r"<para>(.*?)</para>", section, flags=re.S)
# print(result)
#提取函数说明
summary_pattern = r'<summary>(.+?)<\/summary>'
match = re.search(summary_pattern, section, flags=re.DOTALL)
if match:
summary_text = match.group(1).strip()
# print(summary_text)
lines = summary_text.split('\n')
first_line = lines[0].replace('///', '').strip()
# print(first_line)
result1=[f'{x}:{y}\n'for x,y in zip(param_names,param_list)]
# print(result1)
tmp="\t:param "+"\t:param ".join(result1)
# print(tmp)
all+=f'\ndef {func_name}(self,{",".join(param_names)}):\n\t"""\n\t{first_line}\n{tmp}\t:return:{returns[0]}\n\t"""\n\treturn self.instance.{func_name}({",".join(param_names)})\n'
# print(all)
#写入文件中
with open('success.txt', 'w', encoding='utf-8') as f:
f.write(all)
转换后的效果
效果如下: