Python使用模板自动生成代码

整体思想:

完全按照自己的想法来写的,首先写模板文件,然后打开模板文件,对模板进行字符串格式化处理,最后再将格式化后的字符串保存到新的文件里面。如有更好的想法,欢迎交流。

将相似度很高的代码写模板文件(widget_template.txt):

# -*- coding: UTF-8 -*-
#!/usr/bin/env python
#-------------------------------------------------------------------------------
# Name:        auto
# Purpose:
#
# Author:      Yang
#
# Created:     13/08/2015
# Copyright:   (c) Yang 2015
# Licence:     <your licence>
#-------------------------------------------------------------------------------

from PyQt4 import QtGui,QtCore

class %(class_name)s(QtGui.QWidget):
    def __init__(self, parent=None):
        super(%(class_name)s, self).__init__(parent)
        self.items = parent.items if parent else {}
        self.__init_datas()
        self.__create_items()
        self.__set_events()
##        self.setModal(True)
        self.setWindowTitle(u"%(class_title)s")
##        self.setWindowFlags(QtCore.Qt.Dialog|QtCore.Qt.WindowCloseButtonHint)
        self.trans = {"window_title":"%(class_trans)s"}
        self.items["%(class_prefix)s_ui"] = self
        self.__trans_items()

    def __init_datas(self):
        self.data = {}
        self.data["mc_id"] = None
        self.data["snaddr"] = "FF"
        self.data["spaddr"] = "FF"
        self.data["rcaddr"] = "FFFF"
        self.data["operation"] = None
        self.data["mode"] = "save"
        self.data["argvs"] = []

    def __create_items(self):
        pass

    def __set_events(self):
        pass

    def __set_ui_config(self):
        """将数据表示到画面"""
        pass

    def __get_ui_config(self):
        """将画面数据保存到结构体"""
        pass

    def __trans_items(self):
        if self.parent() is None:
            return
        self.parent().trans_items("%(class_prefix)s")

    def __send_request(self, data, show_msg=0, msg_revc=None):
        if self.parent() is None:
            return {}
        if data["mc_id"] is None:
            return {}
        return self.parent().send_request(data, show_msg, msg_revc)

    def showEvent(self, event):
        super(%(class_name)s, self).showEvent(event)

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()
        super(%(class_name)s, self).keyPressEvent(event)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    dialog = %(class_name)s()
    dialog.show()
    sys.exit(app.exec_())

这个是配置文件(config.json),主要是为了方便模板文件修改之后,不用修改自动生成文件的代码。

{
    "template_file":"widget_template.txt",
    "file_name":"SplashSettings.py",
    "class_name":"SplashSettings",
    "class_trans":"splash_setting",
    "class_title":"开机画面设置",
    "class_prefix":"sd_ss"
}

下面是自动生成文件的代码(widget_robot.py)

# -*- coding: UTF-8 -*-
#!/usr/bin/env python

#-------------------------------------------------------------------------------
# Name:        UI自动生成工具
# Purpose:
#
# Author:      Yang
#
# Created:     13/08/2015
# Copyright:   (c) Yang 2015
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import json
import codecs

def main():
    # read config
    config = {}
    with codecs.open("config.json","rb","UTF-8") as f:
        config = json.loads(f.read())
    if not config:
        return

    # read template file
    s = ""
    template = config.get("template_file", "widget_template.txt")
    with codecs.open(template, "rb", "UTF-8") as f:
        s = f.read()
    if not s:
        return
    s = s % config

    # save to file
    fn = config["file_name"]
    with codecs.open(fn, "wb", "UTF-8") as f:
        f.write(s)
        f.flush()

if __name__ == ‘__main__‘:
    try:
        main()
    except Exception,ex:
        print(ex)

总结:

其实很简单的,只要是写过代码的人都能写出来。关键看你想不想去写。

第一次写笔记。祝我在程序员的道路上越走越远。

时间: 2024-10-19 03:22:11

Python使用模板自动生成代码的相关文章

json 对c++类的序列化(自动生成代码)

[动机] 之前写网络协议的时候,使用的是google protobuf,protobuf不但在性能和扩展性上有很好的优势,protoc自动生成c++类代码的工具,这点确实给程序员带来了很多便利. 做后面一项目使用的json格式来传输,然后就萌生了实现像protoc这样的工具,根据json文件来生成c++类代码,并且生成序列化代码,这样在写网络的时候就无需把jsonvalue序列化散落在各处. [思路] 之前写object-c的时候,如果你要对类的序列化,你必须实现NSCoding协议(接口),

Java进阶之 如何自动生成代码

一.前言:为什么要有代码的自动生成? 对于这个问题 最简洁直接的回答就是:代替手动编写代码.提高工作效率. 什么样的场景和代码适合用自动生成这种方式呢? 做过Java服务端的朋友一定都知道代码中我们需要编写与数据库表映射的Java实体类(Entity).需要编写与实体对应的DAO类(XxDao.java类中有包含对应实体的增.删.改.查基本操作).在这些实体类中通常都是一些属性方法以及属性对应的get/set方法.而实体对应的DAO类中也基本会包含有增.删.改.查这些与数据库操作相关的方法.在编

T4模板:MVC中用T4模板快速生成代码

T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true" language="C#" #> <#@ include file="EF.Utility.CS.ttinclude"#> <#@ output extension=".cs" #> <# CodeG

ButterKnife的使用以及不能自动生成代码问题的解决

ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又赔了配环境(linux),并且根据老大的要求看了一些相关的知识点,其中在用到有个工具的时候与到了一些奇葩的问题,就是ButterKnife的不能自动生成代码的问题,查了好多资料和博客才查到,现在总结一下,以备同为码农的程序员不时之需. 大家知道在我们android编程的时候,经常会遇到findVie

Mybatis 自动生成代码,数据库postgresql

最近做了一个项目,使用Mybatis自动生成代码,下面做一下总结,被以后参考: 一.提前准备: 1.工具类:mybatis-generator-core-1.3.2.jar 2.postgresql驱动:postgresql-9.2-1003-jdbc4.jar 3.xml文件 这些我都上传到了附件上,下载链接:Download 二.XML详解 咱们的核心配置文件:mybatisGeneratorConfig.xml <?xml version="1.0" encoding=&q

MyBatis使用Generator自动生成代码

MyBatis中,可以使用Generator自动生成代码,包括DAO层. MODEL层 .MAPPING SQL映射文件. 第一步:下载MyBatis的Generator工具 http://mybatis.github.io/generator/ 第二步:配置自动生成代码所需的XML配置文件,例如(generator.xml) 将这个文件保存至你下载的mybatis-generator-core-1.3.2文件夹下 第三步:进入XML配置文件(generator.xml)所在的的目录并执行命令:

【转】Mybits自动生成代码

一.构建一个环境 1. 首先创建一个表: [sql] view plaincopy CREATE TABLE t_user ( USER_ID INT NOT NULL AUTO_INCREMENT, USER_NAME CHAR(30) NOT NULL, USER_PASSWORD CHAR(10) NOT NULL, USER_EMAIL CHAR(30) NOT NULL, PRIMARY KEY (USER_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf

maven插件mybatis-generator自动生成代码

在开发中ssm框架用的十分广泛.mybatis最为持久层框架,根据xml.或者注解映射数据.自己可以控制sql,灵活简单操作数据库.但是,所有的sql文件都是有自己编写,不仅繁琐,而且很耗时,在开发中,速度.效率很重要.所以很多基础sql是有规律可循,可以根据数据库字段自动生成的.下面就进入今天的主题,通过maven插件mybatis-generator自动生成代码. 1.环境配置,创建maven项目,在pom.xml添加插件配置. <build> <finalName>zsxt&

mybatis使用generator自动生成代码时的类型转换

使用mybatis的generator自动生成代码,但是oracle数据库中number(6,2)总是自动转成BigDecimal,我想要转成的是float类型 这样就写了一个类型转换器,需要继承JavaTypeResolver接口 然后在mybaties配置文件generatorConfig.xml中类型转换配置位置添加上即可 <javaTypeResolver type="com.generator.MyJavaTypeResolver"> <property n