From 8566d64ffd619da685a68dd4b5af6ad2f1014fa9 Mon Sep 17 00:00:00 2001 From: Marcus Huewe Date: Fri, 9 Mar 2018 16:50:09 +0100 Subject: [PATCH] Fix and simplify util.safewriter.SafeWriter Storing the error encoding in an "encoding" attribute "breaks" the python3 "input" function: In essence, builtin_input_impl does a getattr(sys.stdout, 'encoding'), which returns our error encoding instead of the "real" stdout encoding. In order to avoid this, we store the error encoding in an "_encoding" attribute. Making SafeWriter a new-style class simplifies the code a lot. --- osc/util/safewriter.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/osc/util/safewriter.py b/osc/util/safewriter.py index 079e3d83..3d92fcf9 100644 --- a/osc/util/safewriter.py +++ b/osc/util/safewriter.py @@ -1,29 +1,23 @@ # be careful when debugging this code: # don't add print statements when setting sys.stdout = SafeWriter(sys.stdout)... -class SafeWriter: +class SafeWriter(object): """ Safely write an (unicode) str. In case of an "UnicodeEncodeError" the the str is encoded with the "encoding" encoding. All getattr, setattr calls are passed through to the "writer" instance. """ def __init__(self, writer, encoding='unicode_escape'): - self.__dict__['writer'] = writer - self.__dict__['encoding'] = encoding - - def __get_writer(self): - return self.__dict__['writer'] - - def __get_encoding(self): - return self.__dict__['encoding'] + self._writer = writer + self._encoding = encoding def write(self, s): try: - self.__get_writer().write(s) + self._writer.write(s) except UnicodeEncodeError as e: - self.__get_writer().write(s.encode(self.__get_encoding())) + self._writer.write(s.encode(self._encoding)) def __getattr__(self, name): - return getattr(self.__get_writer(), name) + return getattr(self._writer, name) def __setattr__(self, name, value): - setattr(self.__get_writer(), name, value) + super(SafeWriter, self).__setattr__(name, value)