2016-07-18 3 views
4

У меня есть куча кода:Есть ли способ напрямую «украсить» блок кода 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) 

так что я декорирование заявления напрямую, а не заключая их в вспомогательных функциях блока. Есть ли способ добиться чего-то подобного?

+2

Это не будет работать с декораторами. Вы изучали * «менеджеров контекста» *? 'with log_block(): ...' – jonrsharpe

+0

Что вы пытаетесь достичь? Почему просто не вызывать функцию log_block()? Насколько я понимаю, вы не намерены изменять поведение, предоставляя замену следующих за ним утверждений. Таким образом, вы, вероятно, передумали. Более того, менеджер контекста может быть полезен, если вы хотите сохранить область, в которой должны выполняться операторы. – Abhijit

ответ

4

Context managers - это именно то, что вы ищете. Вы используете их с инструкцией with, и они определяют код, который должен быть запущен при входе и выходе из блока.

+0

Раньше я никогда не строил диспетчер контекста, но это оказалось довольно легко, и действительно, это было именно то, что мне было нужно. Благодаря! –

Смежные вопросы