为什么sys.stdout =无效?

hir*_*ist 8 python stdout python-3.x python-internals

我可以这样沉默和恢复sys.stdout:

import sys
sys.stdout = None
print('hello')  # does not write to stdout
sys.stdout = sys.__stdout__
print('hello')  # writes to stdout
Run Code Online (Sandbox Code Playgroud)

我知道我最好使用contextlib.redirect_stdout它可能做类似的事情,但我的问题是:为什么上面的代码工作?

我已经假设python会调用类似的东西sys.stdout.write(),无论我替换sys.stdout它应该至少有一个write方法(例如io.StringIO).

use*_*ica 12

print有一个明确的检查None.

    /* sys.stdout may be None when FILE* stdout isn't connected */
    if (file == Py_None)
        Py_RETURN_NONE;
Run Code Online (Sandbox Code Playgroud)

  • Pypy也遵循它:https://bitbucket.org/pypy/pypy/src/ed869ecba5203208b21f7ec6f0be86fbffa3fcb0/pypy/module/__builtin__/app_io.py?at=default&fileviewer=file-view-default#app_io.py-92 (2认同)
  • 这是我们可以依赖的有记录的行为吗? (2认同)