Лучшие практики для генерации текста в Python
Я пишу скрипт 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...)
2 ответа
Вы действительно не видите примеров такого рода вещей, потому что ваше решение может быть немного перегружено;)
Я предполагаю, что вы пытаетесь собрать некоторое "состояние вещей", а затем хотите запустить сценарий для обработки этого "состояния вещей". Вместо того, чтобы писать мета-скрипт, обычно гораздо удобнее написать скрипт, который будет выполнять обработку (скажем, process.py
) и другой сценарий, который будет выполнять сбор "состояния вещей" (скажем, collect.py
).
Тогда вы можете взять результаты из collect.py
и бросить их в process.py
и выписать todays_results.txt
или некоторые такие: collect.py
-> process.py
-> 20150207_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))
Более сложные структуры данных, чем плоский диктат? Ну, это Питон. Вероятно, для этого существует более одного модуля! Вдобавок ко всему, я бы предложил json, если подойдет обычный текст, или рассол, если вам нужны более подробные структуры. Два предупреждения с pickle: пользовательские объекты не всегда хорошо восстанавливаются, и они уязвимы для атак внедрения кода, поэтому используйте их только в том случае, если весь рабочий процесс заслуживает доверия.
Надеюсь это поможет!
Вы, кажется, переводите ключевое слово за ключевым словом.
Почти наверняка было бы лучше прочитать каждое "предложение" в представительном классе Python; затем вы можете запустить симуляцию напрямую или сделать так, чтобы каждый класс записывал себя в "выходное предложение".
Если все сделано правильно, это должно быть намного проще для написания и отладки, и для получения более идиоматического вывода.