python模板引擎
codra的Python项目详细描述
CODRA
codra是一个用python编写的模板引擎,它在给定模板和填充该模板的数据的情况下呈现字符串
安装
pip install codra
示例
fromcodraimportTemplatetemplate=r"""Hello my name is {{ name }}. I am {{ age }} years old.This is the activities I do:{{ for i, activity in enumerate(activities) }} {{ i }}. {{ activity }}{{ endfor}}Those are the type of numbers less than 20{{ for i in range(20) }} {{ if is_prime(i) }} {{i}} is prime. {{ endif }} {{ if not is_prime(i) }} {{i}} is not prime. {{ endif}}{{ endfor}}"""defis_prime(n):ifn<2:returnFalseelifn==2:returnFalseelse:foriinrange(2,n):ifn%i==0:returnFalsereturnTrueprint(Template(template).render(name="Alice",age=20,activities=["coding","playing","eating"],is_prime=is_prime,enumerate=enumerate))
格式
模板主要由数据和可执行部分组成,这些部分可以相互交错。可执行部分由双大括号包围。{{
可以通过在其前面加反斜杠来转义。
可执行部分(从现在起称为构造)分为三种类型:
1. Expressions.
2. If conditions.
3. For loops.
这些构造最终在呈现后被文本替换。由于表达式可能包含标识符和函数调用,因此它们以kwargs格式提供给呈现函数,其名称显示在模板中。
语言结构
在本节中,将详细介绍不同的语言结构。
表达式
codra中的表达式可以看作是python中表达式的子集。值得注意的是,语义分析是基于python的。表达式使用python中相应的构造进行解析和计算。这可能解释了templare引擎的许多行为。
文字
字符串文本由单引号或双引号包围。
示例:
'hello world'
数字文本是任何连续的数字(目前只支持整数)。尽管只支持整数作为文本,但任何表达式的结果都可以是float的整数。
1984
计划使用区分大小写的关键字true和false添加布尔文本。
算术运算符
运算符+
、-
、/
、*
和%
具有与python中相同的语义。这意味着+
也可以用于连接字符串。
示例:
1 + 2 * 6 / 4 % 5
计算结果为4
比较运算符
您可以使用==
、!=
检查相等性,并使用<
、<=
、>
和'>;=`比较不同的表达式
1 < 4
是真的
逻辑运算符
and
,or and
not`可用于组合比较表达式的结果。
示例:
1 == 2 or not 3 == 4
计算结果为True
接入运营商
访问运算符用于从对象或字典中获取值。
.
用于访问对象的类成员。
[]
用于获取与dict中的键关联的值。
示例:
person.favorite_food['morning']
函数调用
默认情况下提供内置函数len
和range
。要使用其他函数,必须在render的参数中提供它们。若要调用函数,请使用其名称以及由,
分隔并括在括号中的可能为空的参数列表。
示例:
Template("{{ is_odd(1) }}").render(is_odd = lambda x : x % 2 == 1)
计算结果为"True"
如果条件
如果仅当表达式的计算结果为true时才使用条件打印封闭数据:
if条件的语法为:
{{if_condition_}}_body_{{endif}}
if的主体可以是任何有效的模板(数据、构造或两者)。如果条件为true,则if构造的计算结果为其主体,否则,它将被空字符串替换。
示例:
Template("""This is a condition to greet Alice only.{{ if name == "Alice" }}Hello {{ name }}.{{ endif }}""").render(name="Alice")
计算结果为:
"""This is condition to greet Alice only.Hello Alice."""
对于回路
循环可用于迭代任何可iterable python对象(例如列表)。
循环可以有一个或多个变量。它通过将变量分配给给定iterable中的每个项并计算循环体来转换。然后将每次迭代的结果合并为一个单元。
示例:
Template("""{{ for i in range(len(lst)) }}{{i + 1}}. {{ lst[i] }}{{ endfor }}""").render(lst=['a','b','c'])
相当于:
Template("""{{ for i, e in enumerate(lst) }}{{i + 1}}. {{ e }}{{ endfor }}""").render(lst=['a','b','c'],enumerate=enumerate)
评估收件人:
"""1. a2. b3. c"""