Python 抑制函数的输出

Python 抑制函数的输出,python,decorator,timeit,Python,Decorator,Timeit,有一件事我想消除,那就是当函数print to output时,我知道覆盖函数所使用的sys.stdout.write。但我认为这不是一个理想的解决办法。我在寻找一种理想的肾盂手术方法 from timeit import Timer from functools import partial def timing_decorator(function): def wrapper(*args, **kwargs): # print(function) c

有一件事我想消除,那就是当函数print to output时,我知道覆盖函数所使用的
sys.stdout.write
。但我认为这不是一个理想的解决办法。我在寻找一种理想的肾盂手术方法

from timeit import Timer
from functools import partial

def timing_decorator(function):
    def wrapper(*args, **kwargs):
        # print(function)
        callable_f = partial(function, *args, **kwargs)
        # print(dir(Timer))
        total = Timer(callable_f).timeit(1)
        print(total)
        return total
    return wrapper

# example function
@timing_decorator
def hello(arg):
    print(arg)
    return

hello('hi')
这将产生:

hi
0.00036
我的预期产出是:

0.00036

您可以创建一个类似文件的对象,该对象具有一个不执行任何操作的
write()
方法,并让您的装饰程序将其替换为
sys.stdout
(并在调用函数后恢复原始stdout)


注意使用
try
/
finally
以确保即使函数中出现异常也能恢复标准输出。

我们可以使用标准库的
单元测试
模块中的
补丁
来覆盖
打印
功能,仅当使用上下文管理器。然而,尽管如此,@kindall所采用的方法还是比较可取的,因为考虑到这个答案,@kindall所采用的方法更具python风格,它使用的是一些固有的用于测试目的的东西

import sys

class NoOutput:
    def write(text):
        pass

no_output = NoOutput()

def timing_decorator(function):
    def wrapper(*args, **kwargs):
        callable_f = partial(function, *args, **kwargs)
        old_stdout, sys.stdout = sys.stdout, no_output
        try:
            total = Timer(callable_f).timeit(1)
        finally:
            sys.stdout = old_stdout
        print(f"{function.__name__}: {total:.5f}ms")
        return total
    return wrapper
from unittest.mock import patch

def timing_decorator(function):
    def wrapper(*args, **kwargs):
        # print(function)
        callable_f = partial(function, *args, **kwargs)
        with patch('__main__.print'):
            total = Timer(callable_f).timeit(1)
        print(f"{function.__name__}: {total:.5f}ms")
        return total
    return wrapper

您的函数有一行显示
print(arg)
,如果您不希望它打印
arg
,请删除该行line@gold_cy我知道,我想在不删除print()函数的情况下抑制它,这是否回答了您的问题。把你的装潢师放进去对我有用。请不要破坏你自己的帖子。当你在这里发帖时,你给了SO分发CCBYSA4.0下内容的权利。任何故意破坏行为都将恢复原状。如果你想删除你的问题,在问题文本下方有一个“删除”链接。@greg-449对不起,老板,但是StackOverflow说我很遗憾不能删除