【问题标题】:using template engine to generate code (text)使用模板引擎生成代码(文本)
【发布时间】:2017-07-27 04:56:57
【问题描述】:

我在配置文件夹中有一堆 YAML 文件,在模板文件夹中有一堆模板。我的用例是基于 yaml 配置和模板生成文本文件。我想看看是否可以使用 python 诱人的引擎来解决这个问题。

我看到模板引擎用于 Web 开发环境。我的用例非常相似(但不一样)。我想生成一些文本。它不需要显示在网页上。相反,它应该只生成一个文本文件。

示例 输入: 配置文件夹:config/yaml1、config/yaml2、config/yaml3.. 模板:模板/模板1,模板/模板2,模板3。

输出

scripts/script1, script2, script3

脚本数=模板数

有两种类型的模板

一个直接/直接替换示例

YAML1:
    Titles:4
    SubTitles:10
Template1:
Number of Titles {Titles} where as Number of Subtitles is {SubTitles}

其他模板是嵌套的。基本上模板需要循环基于 YAML 示例:

    YAML2:
        Book: "The Choice of using Choice"
            Author: "Unknown1"
        Book: "Chasing Choices"
            Author:"Known2"

Template2
Here are all the Books with Author Info
The author of the {Book} is {Author}

预期的输出是一个包含

的文本文件

标题数 4 其中字幕数为 10 The Choice of using Choice 的作者是 Unknown1 追逐选择的作者是已知的2

有人可以按正确的方向发布我吗?

【问题讨论】:

    标签: python template-engine cheetah


    【解决方案1】:

    您可以使用正则表达式和搜索/替换来做到这一点。您可以将函数而不是字符串传递给re.sub 函数。当然,它依赖于有效的 YAML:

    YAML1: 标题:4 # ^ 这里需要空格 字幕:10 模板1: 标题数 {Titles} 其中字幕数为 {SubTitles} # 这里需要缩进

    python 代码如下所示:

    import re
    import yaml
    
    # Match either {var}, {{, or }}
    TEMPLATE_CODE = re.compile(r'\{(\w+)\}|\{\{|\}\}')
    
    def expand(tmpl, namespace):
        print(namespace)
        def repl(m):
            name = m.group(1)
            if name:
                # Matched {var}
                return str(namespace[name])
            # matched {{ or }}
            return m.group(0)[0]
        return TEMPLATE_CODE.sub(repl, tmpl)
    
    def expand_file(path):
        with open(path) as fp:
            data = yaml.safe_load(fp)
        print(expand(data['Template1'], data['YAML1']))
    

    这是输出:

    标题数量 4 其中字幕数量为 10

    当然,有很多方法可以让这变得更复杂,比如使用适当的模板引擎。

    【讨论】:

    • 我专门寻找更简单的解决方案,例如使用像猎豹这样的诱人引擎。我想知道是否有人可以指出我正确的方向
    • @pmv:为什么这是错误的方向?如果您已经知道要使用什么模板引擎(Cheetah),那么为什么不直接使用它呢?
    • 我正在考虑使用模板引擎作为解决问题的手段。我专门找伪代码
    • 上面的代码类似于模板引擎的工作方式。如果需要,您可以直接放入模板系统来替换 expand
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多