Мне сложно обсуждать вопрос, поэтому я опишу, что я пытаюсь сделать:Как остановить выполнение функции по строкам?
Я пишу тестовое решение для определенного продукта, скажем, микроволновую печь. Целью является измерение всех видов ресурсов, в то время как микроволновая печь используется. Для этого я написал контекстный менеджер под названием measure()
.
Используя микроволновую API я написал функцию, которая имитирует основной случай использования в микроволновой печи, и украсил его с функцией, которая делает все измерения:
def test_function(fn):
def wrapper(*args, **kwargs):
with measure():
fn(*args, **kwargs)
return wrapper
@test_function
def prepare_food():
microwave = Microwave()
microwave.open_door()
microwave.insert_food()
microwave.close_door()
microwave.turn_on(seconds = 60)
prepare_food()
Конечно микроволновый только один пример и у меня много таких «микроволн».
Через несколько дней тестирования и измерение моей команды решил, что они хотят, чтобы измерить каждое действие отдельно, то есть мой тест функцию теперь будут выглядеть следующим образом:
def test_prepare_food():
microwave = Microwave()
actions = {
microwave.open_door : [],
microwave.insert_food : [],
microwave.close_door() : [],
microwave.turn_on : [60]
}
for (action, args) in actions.items():
with measure():
action(*args)
Проблема с новым test_prepare_food
является то, что в настоящее время для каждая функция prepare_food
, мне нужно добавить еще одну функцию test_*
(и у меня много).
Я ищу элегантный способ сохранить мою функцию prepare_food
так же, и обернуть ее другой функцией, чтобы я по-прежнему получал ту же функциональность, что и в test_prepare_food
.
Edit: Целью является решение, которое не будет зависеть от реализации prepare_food()
, так что изменение prepare_food()
не потребует дополнительных изменений. Кроме того, решение не должно влиять на методы, которые не используются prepare_food
.
Другими словами, я хотел бы иметь возможность «вступить в» prepare_food
и иметь возможность выполнять код до и после каждой строки. Это похоже на то, что сделано во время отладки, но я не мог найти ничего подобного.
Любые идеи?
Спасибо!
Просто, чтобы получить это из пути рано: Вы не просто хотите измерить * время выполнения * для каждой строки, правильно? (Потому что это будет работа для профилировщика). Вам также необходимо отслеживать некоторые другие ресурсы, требующие измерения пользовательского кода? –
@LukasGraf - это правильно, я измеряю другие ресурсы, такие как тепло, которое производит микроволновая печь, и т. Д. – NStiner