我想簡單地使用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