My specific use case came from embedding the IPython QtConsole (http://ipython.org/ipython-doc/stable/interactive/qtconsole.html) into a Qt app. Specifically, when a user types "print('foo')" into the QtConsole, I expect 'foo' to be printed in the QtConsole; however when "print('foo')" is called from the application code, I expect 'foo' to be printed in __stdout__ (the original stdout, i.e. the terminal). An in fact, IPython achieves this through temporary stdout redirection while exec'ing user code (https://github.com/ipython/ipython/blob/master/IPython/kernel/inprocess/ipkernel.py#L113).
Obviously, this breaks down if application code tries to call print while redirection is taking place; more subtly, if user code (that is, typed by the user at the QtConsole) starts a new thread, then it would be nice if that new thread could inherit the current settings (that is, stdout being redirected to print to the QtConsole), which is not the case right now (delayed prints go to the terminal as the global stdout gets restored to __stdout__, not to the QtConsole).