4

我正在使用一个科学模拟包,每个“实验”都需要几个基于文本的输入文件。这些文件可能很长,并且有很多样板部分;但是,必须在这些文件中的许多位置输入特定的“特定于实验”的值。

我想自动生成这些文件,并以可维护的方式进行。

现在,我正在使用我编写的 Python 脚本,该脚本使用三引号文本块和变量替换(使用 % 和 .format())在文件中创建部分。然后我将这些块写到适当的文件中。

在生成的输入文件中考虑适当的美学缩进被证明是困难的;此外,随着我​​增强模拟类型和可以处理的选项,自动生成器脚本变得越来越不透明。

有人对如何以更优雅和可维护的方式管理此任务有建议吗?

我知道像 jinja 这样的模板包。除了生成类似 html 的文件之外,这些还有其他好处吗?有没有人将这些用于上述目的?

也许完全不同的方法会更好。

任何建议将不胜感激。

4

2 回答 2

2

Jinja不在乎你制作什么类型的文件。文本就是文本,除非它是二进制的。甚至不确定 Jinja 是否在乎。

IPython,特别是 nbconvert,使用 Jinja2来导出LaTeX、ipynb、markdown 等。

如果您想要演示,还有一个带有 Jinja2 魔法的 IPython 笔记本。

于 2013-09-13T05:05:31.690 回答
1

对于这类问题,我通常采用的方法是创建一个小型函数库来帮助我生成和自定义样板。我不知道您的实验定义语言是什么样的,但通常我需要编写一个函数来写出初始化模拟的文本,一个写出文本以结束模拟的函数和一些其他函数写出定义每种实验类型的不同文本块。

例如,将这些函数放在一个名为 的文件中mysim后,我可以像这样使用它们:

from mysim import sim_init, sim_conclude, experimentType1, experimentType2

sim_init (name="Today's Simulation", author="Simon")
for param1 in [0,1,2,3,4,5,6,7,8,20,30,40,50,60,70]:
    experimentType1 (param1)
    for param2 in ["A", "B", "C"]:
        experimentType2 (param1, param2)
sim_conclude (savefile="output.txt")

此 Python 脚本将生成一个模拟输入文件,该文件将为 和 的每个值运行实验类型 1,为和param1的每个组合运行实验类型 2 。param1param2

函数实现本身可能看起来很乱,但创建特定模拟文件的脚本会简单明了。

于 2013-09-13T06:01:34.273 回答