У меня есть куча кода:Есть ли способ напрямую «украсить» блок кода Python?
statement1(args)
statement2(args)
statement3(args)
statement4(args)
statement5(args)
Я хочу разделить заявления на блоки и записывать в журнал после каждого блока. Ведение журнала немного сложнее: я хочу записывать такие вещи, как время работы каждого блока и состояние конкретной структуры данных после выполнения блока. Поэтому я создал декоратор под названием log_block
, который обрабатывает все эти детали. Теперь мой код выглядит так:
@log_block()
def block1():
statement1(args)
statement2(args)
@log_block()
def block2()
statement3(args)
@log_block()
def block3():
statement4(args)
statement5(args)
block1()
block2()
block3()
Это работает отлично, но это немного неуклюже. Меня раздражает, что я должен отдельно вызывать три функции блока, и если я хочу разделить переменную между блоками, то мне нужно либо дать аргументы функции блока, либо возвращать утверждения, либо использовать глобальные переменные, ни одно из которых не является особенно приемлемым. То, что я действительно хочу, синтаксис, который выглядит следующим образом:
@log_block()
statement1(args)
statement2(args)
@log_block()
statement3(args)
@log_block()
statement4(args)
statement5(args)
так что я декорирование заявления напрямую, а не заключая их в вспомогательных функциях блока. Есть ли способ добиться чего-то подобного?
Это не будет работать с декораторами. Вы изучали * «менеджеров контекста» *? 'with log_block(): ...' – jonrsharpe
Что вы пытаетесь достичь? Почему просто не вызывать функцию log_block()? Насколько я понимаю, вы не намерены изменять поведение, предоставляя замену следующих за ним утверждений. Таким образом, вы, вероятно, передумали. Более того, менеджер контекста может быть полезен, если вы хотите сохранить область, в которой должны выполняться операторы. – Abhijit