Terry, the change I proposed for input() was to make it more closely match how the builtin REPL works in POSIX. The builtin REPL calls PyOS_Readline() with C stdin and stdout. However, if both aren’t interactive (tty) files, PyOS_Readline() always writes the prompt to C stderr.
I modified input() to write the prompt to sys.stderr if both sys.stdin and sys.stdout aren’t interactive. The modified implementation still writes the prompt to sys.stdout if both sys.stdin and sys.stdout are interactive but either is a different file from C stdin or stdout.
In IDLE’s shell, sys.stdin and sys.stdout are both interactive, via their high-level isatty() methods, and they’re unrelated to C stdin and stdout. Thus, under IDLE, the proposed implementation of input() would continue to write the prompt to sys.stdout.
After sys.stderr=None, calling input() results in
RuntimeError: input(): lost sys.stderr. (IDLE re-routes the traceback to sys.stdout.) So sys.stderr is accessed by the call.
Currently input() only uses sys.stderr to call sys.stderr.flush(). This is because PyOS_Readline() may be called, which may write the prompt to C stderr.