Skip to main content

通过函数装饰器进行轻量级字符串模板。

项目描述

# Python Templating with @templet

这是一个优雅的轻量级 python 模板模块,它支持内联 python、快速编译、子模板和子类化,所有这些都在一个用大约 125 行 python 实现的简单装饰器模块中。

## What's New

Templet 由 David Bau 创建,版本 4 的修改由 Krisztián Fekete 完成。版本 4 增加了:

* Python 3 支持。
* 正确的单元测试,验证 python2、python3 和 pypy 支持。
* 仅支持 unicode 字符串(无字节串)。
* 删除了 empty-first-newline 的特殊情况。
*清理代码以提高可读性。

## 用法

要使用模板,只需使用@templet 注释一个python 函数,然后将模板文本放在文档字符串通常所在的位置。将函数体留空,将创建连接内容的高效代码。

```
from Templet import

Templet @templet
def myTemplate(animal, body):
"$animal 跳过了 $body。"

print(myTemplate('cow', 'moon'))
```

这会变成这样:

```
def myTemplate(animal, body):
out = []
out.append("the ")
out.append (str(animal))
out.append(" 跳过了")
out.append(str(body))
out.append("."

```

仅支持六个结构,均以 $ 开头:

| 语法 | 意义 |
|--------|---------|
| `$myvar` | 插入变量 `myvar` 的值 |
| `${...}` | 计算表达式并插入结果 |
| `${[...]}` | 运行列表理解并连接结果 |
| `${{...}}` | 执行封闭的代码;使用 `out.append(text)` 插入文本 |
| `$$` | 单个`$` 的转义|
| `$` | (在行尾)是续行 |

模板中所有普通使用的 `$` 都需要通过加倍 `$$` 进行转义 - 除了(如上所述)`$.`、`$(`、`$/`、`$'` , 和`$"`。

在实际生成的代码中,行号完全对齐,以便在出现代码的模板文件的正确行上报告异常跟踪中的语法错误和运行时错误。

## 哲学

Templet 背后的哲学是只介绍简化python 中长字符串构造所必需的概念;然后鼓励所有其他逻辑使用普通 python 来表达。

@templet 函数可以做任何你可以对任何返回字符串的函数做的事情:它可以被递归调用;它可以有变量或关键字参数;它可以是包的成员或类的方法;它可以访问全局导入或调用其他包。结果,尽管构造非常简单,但它把 python 的所有功能都带到了模板中,@templet 的想法很好地扩展了。

除了简单的插值,templet 没有发明任何新的数据格式化语法。如果要格式化浮点数,可以写`${"%2.3f" % num}`;如果你想转义 HTML 序列,只需编写 `${cgi.escape(message)}`。不像专门的语法那么简短,但对于任何 Python 程序员来说都容易记住、足够简短和可读。

同样,templet 也没有发明任何新的控制流或循环结构。要循环模板,您需要使用 python 循环或列表压缩并将子模板作为函数调用:

```
@templet
def doc_template(table):
"""\
<body>
<h1>${ table.name } </h1>
<table>
${{
for item in table:
out.append(self.row_template(item))
}}
</table>
</body>
"""
```

如果你更喜欢列表推导,它是稍微简单一点:

```
@templet
def doc_template(table):
"""\
<body>
<h1>

${[self.row_template(item) for item in table]}
</table>
</body>
"""
```

该设计鼓励以直线方式阅读的简单模板,从长远来看,这是一个很好的实践。虽然在调用子模板时需要传递状态,当然你可以使用@templet 来制作方法并在“self”上传递状态,或者使用对象参数。

## Details and Style

使用这些注解的一些提示/指南。

空格可以是在 HTML 中很重要,但是为了 python 的可读性,你经常想要缩进,所以@templet 为你提供了一些工具:

* 它识别模板左侧统一使用的前导空格的数量并去除它们。
* 它允许您在行尾使用 `$` 来续行。

所以我推荐的多行模板样式是:

* 在函数中缩进模板文本,就好像它是 python 代码一样。
* 使用 python 三引号并将开头引号放在自己的行上。
* 永远不要缩进 HTML 标签——它们太深了,所以把它们都放在第 0 列
。 * 当嵌套变得混乱时,为了便于阅读,只需在每一行上放一个标签。
* 如果布局需要无空格,请自由使用 `$` 延续。
* 在 `${{` 中缩进代码,然后将 `}}` 放在它自己的行上(在结束 `}}` 之后的换行符被吃掉)。

`${{...}}` 中的 python 代码的相对缩进使用与模板本身相同的前导空格剥离技巧保留,因此您可以像往常一样缩进嵌入式 python,并且可以开始缩进在任何一列感觉自然。我通常将嵌入式 python 缩进一层。

在需要发出每行前导空格的文本的特殊情况下,您可以在要视为第 0 列的列中以带有 `$` 的续行开始模板,如下所示:

`` `
@templet
def indented(x):
"""\
$
var val
x $x
"""
```

一个问题是开头的 `"""` 是否应该与 def 或单独的行在同一行。为了清楚起见,我通常将开头的引号放在单独的行上,但是为了让列正确排列,我吃了带有 python 行继续的换行符立即`"""\`。

例如,如果您想在一行上实现所有以下内容:


```
<tr><td class="..."><a class="..." href="/foo/bar/.. .">....</a></td><td class="...">...</td></tr>
```

然后你可以使用:

```
@templet
def table_row(row_data):
"""\
<tr>$
<td class="${col1_class} def">$
<a class="



</td>$
<td class="${col2_class}">$
${{
if (enrolled): out.append('enrolled')
}}
${cgi.escape(label_text)}$
</td>$
</tr>
"""
```

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

python_templet-4.0.0.tar.gz (8.6 kB 查看哈希

已上传 source