Python 抑制函数的输出
有一件事我想消除,那就是当函数print to output时,我知道覆盖函数所使用的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
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说我很遗憾不能删除