Есть ли примерные примеры GoF Observer, реализованные в Python? У меня есть бит-код, который в настоящее время имеет бит кода отладки, пронесенный через класс ключа (в настоящее время генерирует сообщения для stderr, если установлен волшебный env). Кроме того, у класса есть интерфейс для пошагового возврата результатов, а также для хранения их (в памяти) для последующей обработки. (Сам класс является менеджером заданий для одновременного выполнения команд на удаленных машинах по ssh).
В настоящее время использование класса выглядит примерно так:
job = SSHJobMan(hostlist, cmd)
job.start()
while not job.done():
for each in job.poll():
incrementally_process(job.results[each])
time.sleep(0.2) # or other more useful work
post_process(job.results)
Альтернативная модель использования:
job = SSHJobMan(hostlist, cmd)
job.wait() # implicitly performs a start()
process(job.results)
Все это отлично работает для текущей утилиты. Однако он не обладает гибкостью. Например, я в настоящее время поддерживаю короткий формат вывода или индикатор выполнения в качестве дополнительных результатов, также поддерживаю
краткие, полные и "объединенные сообщения" для функции post_process()
.
Тем не менее, я хотел бы поддерживать несколько потоков результатов/вывода (индикатор выполнения на терминал, отладка и предупреждения в файл журнала, вывод из успешных заданий в один файл/каталог, сообщения об ошибках и другие результаты из неуспеха рабочие места для другого и т.д.).
Это звучит как ситуация, которая вызывает Observer... имеют экземпляры моего класса, которые принимают регистрацию из других объектов и вызывают их обратно с определенными типами событий по мере их возникновения.
Я смотрю PyPubSub, так как я видел несколько ссылок на это в связанных с SO вопросах. Я не уверен, что готов добавить внешнюю зависимость к моей утилите, но я мог видеть ценность использования своего интерфейса в качестве модели для моего, если это облегчит использование другими пользователями. (Проект предназначен как для автономной утилиты командной строки, так и для класса для написания других скриптов/утилит).
Короче, я знаю, как делать то, что я хочу... но есть множество способов его достижения. Мне нужны предложения о том, что наиболее вероятно будет работать для других пользователей кода в конечном итоге.
Сам код находится по адресу: classh.