Возможно использование нескольких обработчиков.
import logging
import auxiliary_module
# create logger with 'spam_application'
log = logging.getLogger('spam_application')
log.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(fh)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
ch.setFormatter(formatter)
log.addHandler(ch)
log.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
log.info('created an instance of auxiliary_module.Auxiliary')
log.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
log.info('finished auxiliary_module.Auxiliary.do_something')
log.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
log.info('done with auxiliary_module.some_function()')
# remember to close the handlers
for handler in log.handlers:
handler.close()
log.removeFilter(handler)
Пожалуйста, смотрите: https://docs.python.org/2/howto/logging-cookbook.html
Вам понадобится более сильная модель для учета временной составляющей изменений:
Каждый спрайт должен поддерживать очередь анимационных действий, которые он должен выполнять. Добавление анимации в очередь должно происходить с нулевым временем действия (игровое время). Анимация в очереди выполняется покадрово, когда они получают отметку от часов анимации. Очередь позволяет вам отделить модель от графической подсистемы и анимации.
Каждая анимация в очереди несет с собой действие модели, которое нужно выполнить после завершения анимации. Некоторые языки делают это проще, например, с помощью анонимных функций в C # или JavaScript. На других языках вместо этого можно использовать обратный вызов. Действие модели позволяет указать, как модель изменится после завершения анимации.
Спрайты могут нести координаты высокого разрешения (например, с плавающей точкой), а модель остается с целыми числами. Однако спрайтам не нужно ничего знать о правилах игры - с этим справляются поставленные в очередь действия модели завершения анимации.
Сущности модели должны уметь учитывать переходные состояния: появление, исчезновение и перемещение. Это позволяет избежать проверки правил для объектов в переходе.
Чтобы реализовать квест Снаффла, вы могли бы:
Пользователь попросил переместить Снаффла на север? - (1) проверьте, что правила разрешают перемещение, (2) поставьте в очередь анимацию перемещения на спрайте Снаффла вместе с действием модели приземления . Переведите модель кролика в переходное состояние движения.
Действие модели Снаффла приземления возвращает модель кролика в нормальное состояние и проверяет место приземления и правила. В поисках шляпы, он ставит в очередь анимацию появления картофеля («слияние») и две анимации исчезновения для кролика и шляпы.
Действия модели для анимаций исчезновения удаляют кролика и шляпу по завершении.