我想简单地使用Python的消息定义文件格式。
让你的消息定义文件是一个普通的Python文件:
# file messages.py
messages = dict(
struct1=[
dict(field="name", type="string", ignore=False),
dict(field="id", type="int", enums={0: "val1", 1: "val2"}),
],
struct2=[
dict(field="object", type="struct1"),
]
)
您的程序可以然后导入并直接使用该数据结构:
# in your program
from messages import messages
print messages['struct1'][0]["type"]
print messages['struct1'][1]['type']
print messages['struct1'][1]['enums'][0]
print messages['struct2'][0]['type']
使用这种方法,你让Python的做为你解析。
而且你也获得了很多可能性。例如,想象一下(出于某种奇怪的原因)有一个包含1000个名为“field_N”的消息结构。使用传统的文件格式,你将不得不添加1000行的字段定义(除非你在你的配置文件解析器中建立了一些循环),然后你就可以创建编程语言了。使用Python为了这个目的,你可以这样做:
messages = dict(
...
strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
...
)
顺便说一句,关于Python 2.6,用代替字典命名为元组是一个选项。或者可以使用众多的“Bunch”类(请参阅Python Cookbook的2.5版的namedtuple)。
编辑:
下面是代码在命令行上所指定读取的消息定义文件。它使用execfile
而不是import
。
# file mainprogram.py
def read_messages_from_file(filename):
module_dict = {}
execfile(filename, module_dict)
return module_dict['messages']
if __name__ == "__main__":
from pprint import pprint
import sys
for arg in sys.argv[1:]:
messages = read_messages_from_file(arg)
pprint(messages)
执行:
$ python mainprogram.py messages1 messages2 messages3
将读取并打印在每个文件中定义的消息。
如果我有3个单独的文件,我写的脚本时不知道其名称。我希望将文件的名称作为参数传入。这将如何完成? – randomThought 2009-12-17 15:40:53
我可以看到这方面的优势,但感觉很糟糕,就像一个巨大的安全风险。或者让你的代码奇迹般地陷入困境。我不确定这是否合理。 – 2009-12-17 15:41:15
如果你认为这是一个安全风险,你应该问自己的第一件事是:谁会将一些恶意代码添加到消息定义文件中。找到那个人并摆脱他。如果他存在,是什么阻止他编辑程序本身? – codeape 2009-12-17 15:57:10