• 热门专题

python 自动生成C++代码 (代码生成器)

作者:大CC  发布日期:2014-07-26 22:34:58
Tag标签:代码  生成器  自动生成  
  • 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++程序代码了;

     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规