stdout假设foo包含print语句,在执行操作时分配变量不会产生任何影响-另一个示例,说明为什么您永远不应该从模块内部导入内容(如此处所做的操作),而始终从模块内部整体导入(然后使用限定名称)。copy顺便说一句,这无关紧要。您的摘要的正确等效项是:
import syssave_stdout = sys.stdoutsys.stdout = open('trash', 'w')foo()sys.stdout = save_stdout现在,当代码正确时,是使它更优雅或更快速的时候了。例如,您可以使用内存中类似文件的对象,而不是文件“ trash”:
import sysimport iosave_stdout = sys.stdoutsys.stdout = io.BytesIO()foo()sys.stdout = save_stdout
为了优雅起见,上下文是最佳的,例如:
import contextlibimport ioimport sys@contextlib.contextmanagerdef nostdout(): save_stdout = sys.stdout sys.stdout = io.BytesIO() yield sys.stdout = save_stdout
一旦定义了此上下文,对于不需要标准输出的任何块,
with nostdout(): foo()
更多优化:您只需要用具有
no-opwrite方法的对象替换
sys.stdout。例如:
import contextlibimport sysclass DummyFile(object): def write(self, x): pass@contextlib.contextmanagerdef nostdout(): save_stdout = sys.stdout sys.stdout = DummyFile() yield sys.stdout = save_stdout
与之前的实现方式相同nostdout。我认为没有比这更干净或更快速的了;-)。



