Python中文本生成的最佳实践

Python中文本生成的最佳实践,python,dynamically-generated,auto-generate,generated-code,Python,Dynamically Generated,Auto Generate,Generated Code,我正在编写一个python脚本,它基于外部文件生成另一个python脚本。下面是我代码的一小部分。我没有接触过很多此类脚本的例子,所以我想知道最佳实践是什么 正如在代码示例的最后两行中所看到的,我使用的技术有时会非常笨拙 SIG_DICT_NAME = "sig_dict" SIG_LEN_KEYWORD = "len" SIG_BUS_IND_KEYWORD = "ind" SIG_EP_ADDR_KEYWORD = "ep_addr" KEYWORD_DEC = "{} = \"{}\"

我正在编写一个python脚本,它基于外部文件生成另一个python脚本。下面是我代码的一小部分。我没有接触过很多此类脚本的例子,所以我想知道最佳实践是什么

正如在代码示例的最后两行中所看到的,我使用的技术有时会非常笨拙

SIG_DICT_NAME = "sig_dict"

SIG_LEN_KEYWORD = "len"
SIG_BUS_IND_KEYWORD = "ind"
SIG_EP_ADDR_KEYWORD = "ep_addr"

KEYWORD_DEC = "{} = \"{}\""

SIG_LEN_KEYWORD_DEC = KEYWORD_DEC.format(SIG_LEN_KEYWORD, SIG_LEN_KEYWORD)
SIG_BUS_IND_KEYWORD_DEC = KEYWORD_DEC.format(SIG_BUS_IND_KEYWORD, 
                                             SIG_BUS_IND_KEYWORD)
SIG_EP_ADDR_KEYWORD_DEC = KEYWORD_DEC.format(SIG_EP_ADDR_KEYWORD, 
                                             SIG_EP_ADDR_KEYWORD)

SIG_DICT_DEC = "{} = dict()"
SIG_DICT_BODY_LINE = "{}[{}.{}] = {{{}:{}, {}:{}, {}:{}}}"

#line1 = SIG_DICT_DEC.format(SIG_DICT_NAME)
#line2 = SIG_DICT_BODY.format(SIG_DICT_NAME, x, y, z...)

你似乎在逐字翻译

几乎可以肯定,将每个“句子”读入一个具有代表性的Python类会更好;然后,您可以直接运行模拟,或者让每个类将自己写入“输出语句”


如果做得正确,编写和调试应该会容易得多,并产生更为惯用的输出。

您没有看到此类示例,因为您的解决方案可能有点过度设计;)

我猜您正在尝试收集一些“事物状态”,然后您希望运行一个脚本来处理该“事物状态”。与编写元脚本相比,通常更方便的是编写一个脚本来进行处理(比如,
process.py
),以及另一个脚本来收集“状态”(比如,
collect.py

然后,您可以从
collect.py
中获取结果,并将其扔到
process.py
中,然后写出
todays\u results.txt
或类似内容:
collect.py
->
process.py
->
20150207\u results.txt

如果需要,您可以使用以下方法将中间文件写入磁盘:

with open('todays_progress.txt') as f_out:
    for thing, state in states_of_things.iteritems():
        f.write('{}<^_^>{}\n'.format(state, thing))
with open('todays_progress.txt') as f_in:
    lines = f_in.read().splitlines()
things, states = [x, y for x, y in lines.split('<^_^>')]
states_of_things = dict(zip(things, states))
以open('todays\u progress.txt')作为f\u out的
:
对于事物,在事物的状态中陈述。iteritems():
f、 写入('{}{}\n'.格式(状态,事物))
然后,您可以稍后使用以下内容将其重新解析:

with open('todays_progress.txt') as f_out:
    for thing, state in states_of_things.iteritems():
        f.write('{}<^_^>{}\n'.format(state, thing))
with open('todays_progress.txt') as f_in:
    lines = f_in.read().splitlines()
things, states = [x, y for x, y in lines.split('<^_^>')]
states_of_things = dict(zip(things, states))
打开('todays\u progress.txt')作为f\u in:
lines=f_in.read().splitlines()
事物,状态=[x,y代表x,y在直线上。拆分(“”)]
事物的状态=dict(zip(事物、状态))
比平面dict更复杂的数据结构?这是Python。这可能不止一个模块!在我的脑海中,我会建议是否使用纯文本,或者是否需要一些更详细的结构。pickle有两个警告:自定义对象并不总是能够很好地重新实例化,而且它容易受到代码注入攻击,因此只有在整个工作流都受信任的情况下才使用它


希望这有帮助

我很想知道-通过这样做,你试图解决什么问题,即,你试图生成的代码是什么?最好的做法是使用更结构化的、不太神奇的方法,比如在你考虑文本生成之前。@HughBothwell外部文件是一个以特定索引存在于某些总线上的数字信号列表。该文件遵循某些约束(如最大索引或最大总线地址),但信号的名称、总线及其索引可能会更改。我希望能够生成能够解析外部文件的Python,并创建一个将信号名映射到其属性(总线、索引、将来的任何其他内容)的字典并为每个信号编写函数来设置或读取信号。可能有一种比动态生成Python脚本更简洁的方法。您可以使用模板文件和?这种方法通常用于web开发(用于生成HTML内容),通常使模板更具可读性。