说明
人写代码总有bug
传统的写代码方式是hardcode。即由人按照程序语言进行编写,然后语言的组件进行编译/解释,交给机器执行。任何一种语言,也包括python,没有办法完美表达人的意思(这意味着表达方式可能不人性化);另外就是机器不接受错别字。
所以手工编写代码错误的概率很好,即便经过多次调试仍然不能保证无错。这就是code by man。
code by code by man 其实指的是人通过工具间接的编程。
除去一些产品之外(例如拖拽编程之类的,那也不是最优方式),其实比较常见的方式是通过配置编程。
总体上我觉得比较清晰的有两种:
1 通过配置
2 通过程序生成代码
配置的方式这里不谈,有兴趣可以看我的另一篇文章
我认为通过jinja生成py文件算是通过程序生成代码。(如果和subprocess配合起来,是可以在运行中产生代码再执行的)
1 j2文件
datamodel.j2
class {{classname}}(db.Model):
__tablename__='{{classname|lower}}'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
{%for str_var in str_var_list%}{{str_var}}= db.Column(db.String(32))
{%endfor%}
{%for num_var in num_var_list%}{{num_var}}= db.Column(db.Float(precision=2))
{%endfor%}
{%for dt_var in dt_var_list%}{{dt_var}}= db.Column(db.DateTime())
{%endfor%}
2 python程序
test1.py
import DataManipulation as dm
# 不传空列表模板知识不处理,不会出错
str_var_list = ['a', 'b', 'c']
num_var_list = ['d1','d2','d3']
dt_var_list =['dt1','dt2']
content = dm.gen_by_j2(template_name='datamodel.j2', classname='Base8v2', str_var_list=str_var_list, num_var_list=num_var_list, dt_var_list=dt_var_list)
with open('tem.py', 'w') as f:
f.write(content)
3 生成的结果
tem.py
class Base8v2(db.Model):
__tablename__='base8v2'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
a= db.Column(db.String(32))
b= db.Column(db.String(32))
c= db.Column(db.String(32))
d1= db.Column(db.Float(precision=2))
d2= db.Column(db.Float(precision=2))
d3= db.Column(db.Float(precision=2))
dt1= db.Column(db.DateTime())
dt2= db.Column(db.DateTime())
4 总结
通过jinja循环,只要在python程序里将变量进行分类,然后把变量列表送入j2文件里就可以生成了。