python 代码自动生成的方法 (代码生成)

遇到的问题

工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错;而借用python的代码自动生成,可以轻松搞定;
(类比JAVA中的Hibernate自动生成的数据库底层操作代码)
下面介绍使用python字符串替换的方法;

Python字符串替换的几种方法

1. 字符串替换
将需要替换的内容使用格式化符替代,后续补上替换内容;

template = "hello %s , your website is %s " % ("大CC","http://blog.me115.com")
print(template)

也可使用format函数完成:

template = "hello {0} , your website is {1} ".format("大CC","http://blog.me115.com")
print(template)

注:该方法适用于变量少的单行字符串替换;

2. 字符串命名格式化符替换
使用命名格式化符,这样,对于多个相同变量的引用,在后续替换只用申明一次即可;

template = "hello %(name)s ,your name is %(name), your website is %(message)s" %{"name":"大CC","message":"http://blog.me115.com"}
print(template)

使用format函数的语法方式:

template = "hello {name} , your name is {name}, your website is {message} ".format(name="大CC",message="http://blog.me115.com")
print(template)

注:适用相同变量较多的单行字符串替换;

3.模版方法替换
使用string中的Template方法;

from string import Template
tempTemplate = string.Template("Hello $name ,your website is $message")
print(tempTemplate.substitute(name='大CC',message='http://blog.me115.com'))

有了模版方法后,就可以将模版保存到文件单独编辑,在生成的地方替换为需要的变量;

示例:代码生成

这个示例使用以上讲到的第三种方法;
建立一个模版文件,里面需要替换的内容使用${}变量替换;

dao_cpp.template

///
/// @class ${CLASSNAME}
/// @brief Redis底层接口类 操作${TABLE_NAME}表
/// TABLE ${TABLE_NAME_UPPER}
/// @author dao_cpp_generator.py
/// @generate date: ${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" namespace redisdao{ #define PRIMARY_KEY "${PRIMER_KEY}"
const string ${CLASSNAME}::TABLE_NAME = "${TABLE_NAME}";
const string ${CLASSNAME}::TABLE_ID = "${TABLE_ID}"; //在数据库中的表的唯一性标识符
const string ${CLASSNAME}::KEY_SEPARETER = "${KEY_SEPARETER}"; ${CLASSNAME}::${CLASSNAME}(void)
{
if ( 0 == m_reHandler.EnsureConnect())
m_bRedisConnected = true;
else
m_bRedisConnected = false;
} ${CLASSNAME}::~${CLASSNAME}(void)
{
} int ${CLASSNAME}::InsertRecord(const string& strVal)
...

python代码生成程序:
cpp_generator.py

#! /usr/bin/env python
#coding=utf-8
#Redis底层操作类CPP文件生成程序(*RedisDao.cpp)
#author me115@126.com 2014-7-22
import os,sys,re,traceback
from datetime import datetime
from string import Template class DaoCppGenerator: def generate(self):
tableName = 'students'
className = '%sRedisDao' % tableName.capitalize()
filePath = r'include/%s.cpp' % className
class_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 %s over. ~ ~' % filePath

有了这个程序,再配合一堆XML配置文件,就可以轻松生成各种C++程序代码了;

Posted by: 大CC | 25JUL,2014
博客:blog.me115.com [订阅]

微博:新浪微博

python 自动生成C++代码 (代码生成)的更多相关文章

  1. Python自动生成代码工具

    项目中有一个需求,对一个基类而言,拥有一个比较方法和拷贝方法,某些地方需要频繁地对这两个方法进行调用.对于所有子类而言,需要重写这两个方法,并在其中维护类内一些成员变量.例如有一个变量m_iMyVal ...

  2. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  3. 利用python自动生成verilog模块例化模板

    一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...

  4. ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码

    概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...

  5. wsdl自动生成Java代码,根据wsdl生成Java代码

    wsdl自动生成Java代码,根据wsdl生成Java代码 >>>>>>>>>>>>>>>>>&g ...

  6. 使用xorm工具,根据数据库自动生成 go 代码

    使用xorm工具,根据数据库自动生成 go 代码 引入 使用 golang 操作数据库的同学都会遇到一个问题 -- 根据数据表结构创建对应的 struct 模型.因为 golang 的使用首字母控制可 ...

  7. mybatis自动生成java代码

    SSM框架没有DB+Record模式,写起来特别费劲,只能用下面的方法勉强凑合. 上图中,*.jar为下载的,src为新建的空白目录,.xml配置如下. <?xml version=" ...

  8. 使用mybatis-generator工具自动生成mybatis代码

    使用mybatis-generator工具自动生成mybatis代码 步骤如下: 1.引入maven  依赖,在项目pom.xml文件中添加 <plugin> <groupId> ...

  9. vs code自动生成html代码

    在dreamveawer中新建一个htm自动会生成一个标准的html代码,那在vscode得一行一行写吗?太烦了吧,各种关键词搜,哎妈 终于找到了办法,现在这里记录下: 第一步:在空文档中输入! 第二 ...

随机推荐

  1. HDU 5724 Chess (状态压缩sg函数博弈) 2016杭电多校联合第一场

    题目:传送门. 题意:有n行,每行最多20个棋子,对于一个棋子来说,如果他右面没有棋子,可以移动到他右面:如果有棋子,就跳过这些棋子移动到后面的空格,不能移动的人输. 题解:状态压缩博弈,对于一行2^ ...

  2. cgroup的测试数据

    [root@xxxx /cgroup/memory/rule3021]#cat memory.limit_in_bytes503316480   480M [root@xxxx /cgroup/mem ...

  3. Fiddler基础使用二之捕获手机应用https请求

    Fiddler是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个http的代理服务,然后它会转发所有的http请求和响应, 因此,它比一般的firebug或者是chrome自带的抓 ...

  4. SpringMVC返回json数据的三种方式(转)

    原文:https://blog.csdn.net/shan9liang/article/details/42181345# 1.第一种方式是spring2时代的产物,也就是每个json视图contro ...

  5. vue---mixins的用法

    相信大家都用过less.sass等预编译.它们中也有mixins,用法也很简单,例如Less中: .box{ border:1px solid red; padding:10px; } .mixin ...

  6. gnuradio 使用eclipse 编辑记录

    第1步 - 首先安装eclipse 先去官网下载,然后解压  --->下载版本是C++/C 版---->解压--->打开--->help->eclipse marketp ...

  7. 对接口(interface)的思考

    接口,java中用关键字interface定义.今天学习java基础API时,发现一个特点:每个包中都定义了一堆的接口,感觉有马克思主义中提到的“上层建筑”的味道.接口就是为需要实现的功能定一个基调, ...

  8. Error: spawn EACCES

    执行sudo cordova emulate ios: 错误: Running command: /Users/frank/xx/hybird_web/hooks/after_prepare/010_ ...

  9. 在vue中使用animate.css

    animate.css是一款前端动画库,相似的有velocity-animate 用法: 首先 npm install animate.css --save 然后在vue文件的script中引入: i ...

  10. SVN升级到1.8后 Upgrade working copy

    SVN升级到1.8后没法用了,不能提交,提示说要SVN Upgrade working copy, 但是半天在根目录和.svn所在文件夹上面右键都没有找到这个菜单. 坑爹的…… 最后找到解决办法是:重 ...