忽略输出的最具python风格的方式

忽略输出的最具python风格的方式,python,Python,我有一个类,它使用上下文管理协议在一段时间内拥有一个静默的stderr流(主要用于py2exe部署,其中应用程序向stderr写入任何内容都会在应用程序关闭时导致难看的对话框,我正在做一些我知道会有一些stderr输出的事情) 我的问题是什么会更具python风格,这是一种相当干净的解决方案,打开系统的位桶并写入,或者跳过fd和write操作的分配,并创建一个新的类ala: class nullWriter(object): def write(self, string):

我有一个类,它使用上下文管理协议在一段时间内拥有一个静默的stderr流(主要用于py2exe部署,其中应用程序向stderr写入任何内容都会在应用程序关闭时导致难看的对话框,我正在做一些我知道会有一些stderr输出的事情)

我的问题是什么会更具python风格,这是一种相当干净的解决方案,打开系统的位桶并写入,或者跳过fd和write操作的分配,并创建一个新的类ala:

class nullWriter(object):
    def write(self, string):
        pass
然后将上述代码替换为

from contextlib import contextmanager

@contextmanager
def noStderr():
    stderr = sys.stderr
    sys.stderr = nullWriter()
    yield
    sys.stderr = stderr

我觉得nullWriter类会更“Pythonic”,因为它使用已经存在的Python接口(您可以将sys.stderr分配给任何具有写入方法的对象),而不必像您所说的那样进入系统环境并写入“位桶”:)

我认为后一种解决方案更优雅。避免进入系统环境,这可能会浪费fd。为什么要在不需要的时候退出操作系统呢?

这是一个决定,要么使用已经存在的东西(
os.devnull
),但有点“混乱”(您需要
open()
it等等),要么创建您自己的解决方案,这可能更简单,但您正在创建的是一个新类


虽然两者都很好,但我还是选择了
nullWriter
,因为它更干净,依赖于纯python知识,不会弄乱操作系统的东西。

这有什么问题吗

import sys

sys.stderr = open('/dev/null', 'w')

谢谢大家的回复


我想我会采用这种方法。我知道这两个选项都有效,但更感兴趣的是看什么看起来更干净(尤其是打开文件的开销是可以忽略的)。

和FWIW,我想说写入“位桶”将是一个更完美的解决方案:)正如abyx所建议的,您应该使用os.devnull来实现平台独立。由于OP提到了py2exe,这可能是一个Windows box.true。然而,这不是重点。我不太关心演示解决方案的那几行代码的可移植性,但由于他可能是在Windows环境中,他甚至可能不知道/dev/null是什么意思,这使得您的建议没有应有的帮助。
import sys

sys.stderr = open('/dev/null', 'w')