使用Python生成源文件的两种方法
利用Python的字符串处理模块,开发者能够编写脚本用来生成那些格式同样的C、C++、JAVA源程序、头文件和測试文件,从而避免大量的反复工作。
本文概述两种利用Python string类生成java源码的方法。
1。String Template
Template是一个好东西,能够将字符串的格式固定下来,反复利用。Template也能够让开发者能够分别考虑字符串的格式和其内容了。无形中减轻了开发者的压力。
Template属于string中的一个类,有两个重要的方法:substitute和safe_substitute。替换时使用substitute()。若未能提供模板所需的所有參数值时会发生异常。使用safe_substitute() 则会替换存在的字典值,保留未存在的替换符号。
要使用的话可用下面方式调用:
fromstringimportTemplate
Template有个特殊标示符$,它具有下面的规则:
(1)主要实现方式为$xxx,当中xxx是满足python命名规则的字符串,即不能以数字开头、不能为keyword等;
(2)假设$xxx须要和其它字符串接触时,用{}将xxx包裹起来。
开发者通过编写template文件,并通过Template方法创建模板、substitute方法替换字符串就可以快捷的生成所需的文件。编写template文件时一定要注意“$”的使用,由于Python会将以“$”开头的字符串理解成须要替换的变量。
2,replace
str.replace(old, new[, max])
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串)。假设指定第三个參数max,则替换不超过 max 次。
模板文件tenplate.java(自:基于模板的简易代码生成器Python源代码)
/**
* created since ${now}
*/
package com.alipay.mspcore.common.dal.ibatis;
import java.util.Date;
import junit.framework.Assert;
import com.alipay.mspcore.common.dal.daointerface.${testObject}DAO;
import com.alipay.mspcore.common.dal.dataobject.${testObject};
import com.alipay.sofa.runtime.test.AnnotatedAutowireSofaTestCase;
import com.iwallet.biz.common.util.money.Money;
/**
* @author ${author}
* @version ${version}: MBIM_Service${testObject}_Device.java, ${now} ${author}
*/
public class Ibatis${testObject}DAOTester extends AnnotatedAutowireSofaTestCase {
@Override
public String[] getConfigurationLocations() {
return new String[] { "META-INF/spring/common-dal-db.xml",
"META-INF/spring/mobilespcore-common-dal-dao.xml", "META-INF/spring/common-dal.xml" };
}
@Override
public String[] getResourceFilterNames() {
return new String[] { "META-INF/spring/common-dal-db.xml" };
}
@Override
public String[] getWebServiceConfigurationLocations() {
return new String[] {};
}
private ${testObject}DAO get${testObject}DAO() {
${testObject}DAO dao = (${testObject}DAO) this.getBean("${testObjVarName}DAO", ${testObject}DAO.class, null);
return dao;
}
public void test${testObject}DAO() {
${testObject}DAO configDAO = get${testObject}DAO();
Assert.assertNotNull(configDAO);
}
public void test() {
${testObject}DO ${testObjVarName}DO = new ${testObject}DO();
${testObjVarName}DO.setGmtCreate(new Date());
${testObjVarName}DO.setGmtModified(new Date());
${testObjVarName}DO.setId(10000);
${testObject}DAO ${testObjVarName}DAO = get${testObject}DAO();
long result = ${testObjVarName}DAO.insert(${testObjVarName}DO);
Assert.assertTrue(result > 0);
}
}
Python代码
import os
import datetime
from string import Template tplFilePath = 'D:\\Project\\Python\\code_gen\\template.java'
path = 'D:\\Project\\Python\\code_gen\\' testObjList = ['Basic_connect',\
'Sms',\
'Phonebook',\
] for testObj in testObjList: testObjVarName = testObj[0].lower() + testObj[1:] filename = 'MBIM_Service_' + testObj +'_device.java'
author = 'AidanZhang'
version='V0.1' now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') tplFile = open(tplFilePath)
gFile = open(path+filename ,"w") #method 1 with Template and substitute(safe_substitute)
lines=[]
tmp=Template(tplFile.read()) lines.append(tmp.substitute(
author = author,
now = now,
testObject = testObj,
testObjVarName = testObjVarName,
version = version)) gFile.writelines(lines)
'''
#Method 2, with replace
fileList = tplFile.readlines() for fileLine in fileList:
line = fileLine.replace('${author}',author)\
.replace('${now}',now)\
.replace('${testObject}',testObj)\
.replace('${version}',version)\
.replace('${testObjVarName}',testObjVarName)
print line
gFile.writelines(line)
'''
tplFile.close()
gFile.close()
print 'generate %s over. ~ ~' % (path+filename)
执行结果
generate D:\Project\Python\code_gen\MBIM_Service_Basic_connect_device.java over. ~ ~
generate D:\Project\Python\code_gen\MBIM_Service_Sms_device.java over. ~ ~
generate D:\Project\Python\code_gen\MBIM_Service_Phonebook_device.java over. ~ ~
使用Python生成源文件的两种方法的更多相关文章
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- 转:python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...
- python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法方法1 用List的内建函数list sort进行排序list sort(func=None, key=None, reverse=False)Pytho ...
- Python修改文件的两种方法
目录: 一.以占用内存的方式修改文件 二.以占用硬盘的方式修改文件 引言 文件修改的方法从操作方式上大致可以分为两类,一种是以占用电脑内存的方式,将文件读取到内存中修改再存回硬盘:第二种方法是分别打开 ...
- Python随机生成验证码的两种方法
Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种 ...
- python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...
- 【Python】python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 1 import ...
- python 取整的两种方法
问题简介: 要把一个浮点数(float)整数部分提取出来.比如把“2.1”变成“2”的这一过程:现在我们给这个过程起一个名字叫“取整”.那么它 在python中大致可以有两种写法 写法1)类型转换: ...
- python 调用内部类的两种方法
class Car:#外部类 class Door:#内部类 def open(self): print('open door') class Wheel: def run(self): print( ...
随机推荐
- jFinal基于maven简单的demo
JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再拥有ruby.py ...
- set()集合的概念与一般操作
1.概念 set集合是python的一种基本数据类型,其特点为: 1.元素不重复(可以利用这条性质除去重复元素) 2.在集合中无序 3.元素可hash(int,str,bool,tuple) set集 ...
- F - Modular Exponentiation
Problem description The following problem is well-known: given integers n and m, calculate 2n mod m, ...
- 5.13Junit单元测试-反射-注解
一.Junit单元测试 * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要些代码的.关注程序具体的执行流程 Junit使用:白盒测试 步骤: 1.定义 ...
- sql学习--insert
insert的四种插入方式 第一种最简单的 into 和目标列的列表是可选的 intsert [into] tableA [(col1,col2)] values(val1,val2) 第二种 ins ...
- 【HTTP】如何正常关闭连接
参考:<HTTP权威指南> 所有HTTP客户端.服务器或者代理都可以任意时刻关闭一条TCP传输连接.但是服务器永远无法确定它关闭“空闲”连接的那一刻,在线路那一头的客户端有没有数据要发送. ...
- VmWare 安装 Centos
VMware CentOS7 的 ISO 文件 方法/步骤 1 打开虚拟机软件“VMware”,选择“创建新的虚拟机”: 2 选择“自定义(高级)”选项,点击“下一步”: 3 在“硬件兼容性”处选 ...
- 查看 Android App 的 versionCode
有 App 源码时,可以直接查看 AndroidManifest.xml 文件. <manifest android:versionName="1.4" android:ve ...
- Assembly之instruction之Register Mode
Assembler Code Content of ROM MOV R10,R11 MOV R10,R11 Length: One or two words Operation: Move the c ...
- 微信小程序 PDF下载打印
在开发微信小程序时,需要打印生成的PDF,实现思路是:后端生成相应的PDF,微信小程序下载并打开. 但是微信小程序并不可以打印,所以需要借助其他APP比如:WPS,但是发现微信小程序down的PDF在 ...