检查一个函数在python中使用print-function

时间:2017-02-28 13:31:04

标签: python printing python-decorators

我想在python中写一个装饰器:如果被调用的函数包含print,装饰器会在调用此函数之前打印她的名字。我熟悉装饰器语法,但是我在检查函数本身是否有print时遇到问题。

def preceeding_name(func):        
    @wraps(func)
    def wrapper(*args, **kwargs):
        if 'print' in func: 
            print(func.__name__)
        result = func(*args, **kwargs)
        return result
    return wrapper

没有必要检查函数中的print是否实际被调用。

2 个答案:

答案 0 :(得分:3)

这可以通过暂停“打印”缓冲区并检查它以查看是否已完成打印来完成。

class Out(object):
    def write(self,s):
        self.s += s
    def __init__(self)
        self.s = '' 

现在检查

def wrapper(*args, **kwargs):
        our_out = Out()
        sys.stdout = our_out
        result = func(*args, **kwargs)

        if len(our_out.s)>0:
            sys.stdout = sys.__stdout__
            print func.__name__
            for s in our_out.s.split('\n'):
                print s     

        return result

答案 1 :(得分:-1)

我在这种情况下可以重新定义打印

def preceeding_name(func):
    @wraps(func)
    def wrapper(*args, **kwargs):

        old_print = print

        def print(*arg, **kwarg):
            old_print(func.__name__)
            old_print(*arg, **kwarg)

        result = func(*args, **kwargs)
        return result
    return wrapper

编辑: 我测试和这项工作

old_print = print

def preceeding_name(func):

    def print(*arg, **kwarg):
        old_print(func.__name__, end='')
        old_print(*arg, **kwarg)

    def wrapper(*args, **kwargs):
        print('')
        result = func(*args, **kwargs)
        return result
    return wrapper

@preceeding_name
def a():
    print('hi')


a()

@preceeding_name
def b():
    print('hi')


b()

EDIT2:

old_print = print


def preceeding_name(func):
    global print
    def print(*arg, **kwarg):
        old_print(func.__name__)
        old_print(*arg, **kwarg)

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result

    return wrapper


@preceeding_name
def a():
    print('hi')


a()


@preceeding_name
def b():
    # print('hi')
    pass

b()