jinja2 enumerate
默认从 1 开始
>>> from jinja2 import Template
>>> s = "{% for element in elements %}{{loop.index}} {% endfor %}"
>>> Template(s).render(elements=["a", "b", "c", "d"])
1 2 3 4
In addition to loop.index, there is also
loop.index0 (index starting at 0)
loop.revindex (reverse index; ending at 1)
loop.revindex0 (reverse index; ending at 0)
Even more at http://jinja.pocoo.org/docs/templates/.
https://stackoverflow.com/questions/12145434/how-to-output-loop-counter-in-python-jinja-template
python 把字符串当做代码执行
list_string = '[1, 2, 3, 4, 5]' # 要执行的Python列表字符串
result = eval(list_string) # 执行Python列表字符串并返回结果
print(result) # 输出结果
请注意,使用eval()函数来执行字符串中的代码存在一定的安全风险,特别是当字符串来自不可信的来源时。因此,应该谨慎使用并确保代码字符串的来源可信。
另外,为了避免潜在的安全问题和代码执行风险,也可以考虑使用更安全的方法来解析和执行字符串,例如使用ast.literal_eval()函数。ast.literal_eval()函数用于将字符串转换为Python字面值表达式的值,其中包括列表、字典、字符串等。它提供了更严格的语法解析,并且不会执行任意的代码。
以下是使用ast.literal_eval()的示例:
import ast
list_string = '[1, 2, 3, 4, 5]' # 要执行的Python列表字符串
result = ast.literal_eval(list_string) # 解析字符串并返回结果
print(result) # 输出结果
模板引擎的使用场景非常广泛,可以用于自动生成代码、邮件模板、网页模板、报告生成等。比如在 Web 开发中,可以使用模板引擎来动态生成 HTML 页面,从而实现数据与展示的分离,提高代码的可维护性和可扩展性。在机器学习领域,可以使用模板引擎来自动生成文档、报告和代码等,提高工作效率。另外,模板引擎还可以用于数据处理和数据分析等领域,例如数据报表的生成等。
使用 Jinja2 模板引擎生成 Python 代码的例子,根据模板中的变量和逻辑生成一个计算器的类:
from jinja2 import Template
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
def subtract(self, num):
self.result -= num
def multiply(self, num):
self.result *= num
def divide(self, num):
self.result /= num
def reset(self):
self.result = 0
template = Template("""
class {{ class_name }}:
def __init__(self):
self.result = 0
{% for op in operations %}
def {{ op.name }}(self, num):
{% if op.operator == '+' %}
self.result += num
{% elif op.operator == '-' %}
self.result -= num
{% elif op.operator == '*' %}
self.result *= num
{% elif op.operator == '/' %}
self.result /= num
{% endif %}
{% endfor %}
def reset(self):
self.result = 0
""")
operations = [
{'name': 'add', 'operator': '+'},
{'name': 'subtract', 'operator': '-'},
{'name': 'multiply', 'operator': '*'},
{'name': 'divide', 'operator': '/'},
]
class_name = 'MyCalculator'
generated_code = template.render(class_name=class_name, operations=operations)
print(generated_code)
输出的代码
class MyCalculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
def subtract(self, num):
self.result -= num
def multiply(self, num):
self.result *= num
def divide(self, num):
self.result /= num
def reset(self):
self.result = 0
生成 html 代码
from jinja2 import Template
# 1. 创建 HTML 模板
html_template = Template("""
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
<p>{{ body }}</p>
</body>
</html>
""")
# 2. 加载 HTML 模板
# 3. 定义要传递给模板的动态数据
data = {
"title": "Welcome to my website",
"heading": "Hello World!",
"body": "This is a sample paragraph."
}
# 4. 将动态数据注入到模板中的占位符中
html_output = html_template.render(data)
# 5. 输出生成的 HTML
print(html_output)
生成java代码
在模板中,{% %} 表示控制语句,如 for 循环和 if 判断等。
from jinja2 import Template
template_str = """
public class {{ class_name }} {
{% for attribute in attributes %}
private {{ attribute.type }} {{ attribute.name }};
{% endfor %}
{% for method in methods %}
public {{ method.return_type }} {{ method.name }}() {
return this.{{ method.name }};
}
{% endfor %}
}
"""
data = {
"class_name": "Person",
"attributes": [
{"name": "name", "type": "String"},
{"name": "age", "type": "int"},
],
"methods": [
{"name": "getName", "return_type": "String"},
{"name": "getAge", "return_type": "int"},
],
}
template = Template(template_str)
java_code = template.render(data)
print(java_code)
生成的 java 代码