Как распечатать начало и конец функции с подробным описанием, Python?

Я написал хороший кусок кода, и я хочу улучшить свой подробный вывод. У меня была идея if verbose: print '**** function_name ****' в начале и в конце функции, и я даже определил функцию, чтобы упростить вызов (я использую очень сексуальную подробную печать, написанную kindall здесь)

def verbwrap(function, side):
    if side=='start':
        verboseprint(' ******  %s  ******' %(function))
    if side=='end': 
        verboseprint(' ^^^^^^  %s  ^^^^^^' %(function))

с намерением использовать его следующим образом:

import inspect

def test(lst):
    verbwrap(inspect.currentframe().f_code.co_name,'start')
    for i in lst:
        print i
    verbwrap('test', 'end') #equivalent to above, but easier to write :(

Есть ли способ вызвать переработанный verbwrap() только один раз? Никакие возни не привели меня к ответу!


person FriskyGrub    schedule 11.07.2016    source источник
comment
Что вы имеете в виду, когда называете переработанный verbwrap() один раз?   -  person Moon Cheesez    schedule 11.07.2016
comment
извините, я имею в виду, есть ли альтернатива моему verbwrap(), которую нужно было бы вызывать только один раз внутри test() для печати в начале и в конце функции?   -  person FriskyGrub    schedule 11.07.2016


Ответы (1)


Учитывая, что вы хотите напечатать что-то только в начале и в конце функции, лучший способ сделать это — использовать декоратор.

def verbwrap(function):
    def wrapper(*args, **kwargs):
        verboseprint(' ******  %s  ******' %(function.__name__))
        result = function(*args, **kwargs)
        verboseprint(' ^^^^^^  %s  ^^^^^^' %(function.__name__))
        return result
    return wrapper

Теперь используйте декоратор выше с любой функцией, которую вы хотите отлаживать:

@verbwrap
def test(lst):
    for i in lst:
        print i

Демонстрация:

Когда verbose это True:

 ******  test  ******
1
2
3
 ^^^^^^  test  ^^^^^^

Когда verbose это False:

1
2
3

Вы можете сделать это еще более динамичным, вычислив значение verbose внутри функции wrapper, используя этот подход, вы можете решить отлаживать или не отлаживать, когда функция фактически вызывается.

def verbwrap(function):
    def wrapper(*args, **kwargs):
        # Calculate the value of `verbose` here.
        # Say you're reading it from a config etc
        verbose = False
        if verbose:
            print ' ******  %s  ******' %(function.__name__)
            result = function(*args, **kwargs)
            print ' ^^^^^^  %s  ^^^^^^' %(function.__name__)
            return result
        else:
            return function(*args, **kwargs)
    return wrapper
person Ashwini Chaudhary    schedule 11.07.2016
comment
Вау, это потрясающе! Я не знал о декораторах, это действительно аккуратно. Спасибо. - person FriskyGrub; 12.07.2016