Лучшие практики для генерации текста в 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; затем вы можете запустить симуляцию напрямую или сделать так, чтобы каждый класс записывал себя в "выходное предложение".

Если все сделано правильно, это должно быть намного проще для написания и отладки, и для получения более идиоматического вывода.

Другие вопросы по тегам