나는 단순히 메시지 정의 파일 형식 파이썬을 사용합니다.
메시지 정의 파일이 일반 파이썬 파일하자 :
이
# 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']
를, 파이썬은을하자 당신을 위해 파싱.
당신은 또한 많은 가능성을 얻습니다. 예를 들어, (이상한 이유로) 여러분이 "field_N"이라는 1000 개의 필드를 가진 메시지 구조를 가지고 있다고 상상해보십시오. 기존 파일 형식을 사용하면 1000 줄의 필드 정의를 추가해야합니다 (구성 파일 파서에 루핑을 작성하지 않는 한 - 어쨌든 프로그래밍 언어를 만드는 중입니다). 이 목적을 위해 파이썬을 사용하면 같은 뭔가를 할 수 : 대신 DICT의 이름 튜플을 사용하여, 파이썬 2.6,
messages = dict(
...
strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
...
)
BTW하는 것은 옵션입니다. 또는 여러 개의 "Bunch"클래스를 사용할 수 있습니다 (2.5의 namedtuple은 Python 요리 책을 참조하십시오).
편집 : 명령 행에 지정된 메시지 정의 파일을 읽어
다음
입니다 코드입니다. import
대신 execfile
을 사용합니다.
# 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
나는이 점에서 이점을 볼 수 있지만 엄청난 보안 위험처럼 느껴진다. 또는 코드가 마술처럼 엉망이 될 수도 있습니다. 비록 그것이 의미가 있는지 나는 잘 모르겠다. –
이것이 보안 위험이라고 생각하는 경우 가장 먼저해야 할 일은 다음과 같습니다. 메시지 정의 파일에 악성 코드를 추가 할 사람은 누구입니까? 그 남자를 찾아서 제거하십시오. 그리고 그가 존재한다면, 그로 하여금 프로그램 자체를 편집하지 못하게 막고있는 것은 무엇입니까? – codeape