python代码自动生成的方法(代码生成器)
工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错;而借用python的代码自动生成,可以轻松搞定;(类比JAVA中的Hibernate自动生成的数据库底层操作代码)下面介绍使用python字符串替换的方法;
1.字符串替换将需要替换的内容使用格式化符替代,后续补上替换内容;
2.字符串命名格式化符替换使用命名格式化符,这样,对于多个相同变量的引用,在后续替换只用申明一次即可;
3.模版方法替换使用string中的Template方法;
这个示例使用以上讲到的第三种方法;建立一个模版文件,里面需要替换的内容使用${}变量替换;dao_cpp.template
//////@class${CLASSNAME}///@briefRedis底层接口类操作${TABLE_NAME}表///TABLE${TABLE_NAME_UPPER}///@authordao_cpp_generator.py///@generatedate:${GENE_DATE}///[注:本文件为自动生成,不需要人为编辑,若有修改,请通过配置py脚本来重新生成.]#include"${CLASSNAME}.h"#include"include/${TABLE_NAME}_t.h"#include"RedisManager.h"#include"common/LogMacros.h"#include"common/StringUtility/OtherStringFunc.h"#include"common/DateTime.h"namespaceredisdao{#definePRIMARY_KEY"${PRIMER_KEY}"conststring${CLASSNAME}::TABLE_NAME="${TABLE_NAME}";conststring${CLASSNAME}::TABLE_ID="${TABLE_ID}";//在数据库中的表的唯一性标识符conststring${CLASSNAME}::KEY_SEPARETER="${KEY_SEPARETER}";${CLASSNAME}::${CLASSNAME}(void){if(0==m_reHandler.EnsureConnect())m_bRedisConnected=true;elsem_bRedisConnected=false;}${CLASSNAME}::~${CLASSNAME}(void){}int${CLASSNAME}::InsertRecord(conststring&strVal)...python代码生成程序:cpp_generator.py
#!/usr/bin/envpython#coding=utf-8#Redis底层操作类CPP文件生成程序(*RedisDao.cpp)#authorme115@126.com2014-7-22importos,sys,re,tracebackfromdatetimeimportdatetimefromstringimportTemplateclassDaoCppGenerator:defgenerate(self):tableName='students'className='%sRedisDao'%tableName.capitalize()filePath=r'include/%s.cpp'%classNameclass_file=open(filePath,'w')lines=[]#模版文件template_file=open(r'dao_cpp.template','r')tmpl=Template(template_file.read())#模版替换lines.append(tmpl.substitute(CLASSNAME=className,TABLE_NAME=tableName,TABLE_NAME_UPPER=tableName.upper(),GENE_DATE=datetime.now().strftime('%Y-%m-%d%H:%M:%S'),TABLE_ID='115',EXPIRE_DATE='06JUN14'))#0.将生成的代码写入文件class_file.writelines(lines)class_file.close()print'generate%sover.~~'%filePath有了这个程序,再配合一堆XML配置文件,就可以轻松生成各种C++程序代码了;