Issue #13532: Check that arguments to sys.stdout.write are strings.

This commit is contained in:
Martin v. Löwis 2012-07-09 20:46:11 +02:00
parent 44dea9d03f
commit 9ae3f7a189
3 changed files with 25 additions and 3 deletions

View File

@ -1,6 +1,8 @@
What's New in IDLE 3.2.4?
=========================
- Issue #13532: Check that arguments to sys.stdout.write are strings.
- Issue # 12510: Attempt to get certain tool tips no longer crashes IDLE.
Erroneous tool tips have been corrected. Default added for callables.

View File

@ -1242,6 +1242,8 @@ class PseudoFile(object):
self.encoding = encoding
def write(self, s):
if not isinstance(s, str):
raise TypeError('must be str, not ' + type(s).__name__)
self.shell.write(s, self.tags)
def writelines(self, lines):

View File

@ -1,4 +1,5 @@
import sys
import io
import linecache
import time
import socket
@ -244,6 +245,23 @@ class MyRPCServer(rpc.RPCServer):
quitting = True
thread.interrupt_main()
class _RPCFile(io.TextIOBase):
"""Wrapper class for the RPC proxy to typecheck arguments
that may not support pickling."""
def __init__(self, rpc):
super.__setattr__(self, 'rpc', rpc)
def __getattr__(self, name):
return getattr(self.rpc, name)
def __setattr__(self, name, value):
return setattr(self.rpc, name, value)
def write(self, s):
if not isinstance(s, str):
raise TypeError('must be str, not ' + type(s).__name__)
return self.rpc.write(s)
class MyHandler(rpc.RPCHandler):
@ -251,9 +269,9 @@ class MyHandler(rpc.RPCHandler):
"""Override base method"""
executive = Executive(self)
self.register("exec", executive)
sys.stdin = self.console = self.get_remote_proxy("stdin")
sys.stdout = self.get_remote_proxy("stdout")
sys.stderr = self.get_remote_proxy("stderr")
sys.stdin = self.console = _RPCFile(self.get_remote_proxy("stdin"))
sys.stdout = _RPCFile(self.get_remote_proxy("stdout"))
sys.stderr = _RPCFile(self.get_remote_proxy("stderr"))
# page help() text to shell.
import pydoc # import must be done here to capture i/o binding
pydoc.pager = pydoc.plainpager