Optimize unicode wrappers. Thanks to Marat Radchenko <marat@slonopotamus.org>
[portage.git] / pym / portage / __init__.py
index 5141e98189732d1267c8c041c84a8923b631e57c..3adf55923bd6d3399580720e5bd98d9f5bea079b 100644 (file)
@@ -141,22 +141,26 @@ _encodings = {
 if _encodings['merge'] is None:
        _encodings['merge'] = 'ascii'
 
-def _unicode_encode(s, encoding=_encodings['content'],
-       errors='backslashreplace'):
-       if sys.hexversion >= 0x3000000:
+if sys.hexversion >= 0x3000000:
+       def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
                if isinstance(s, str):
                        s = s.encode(encoding, errors)
-       elif isinstance(s, unicode):
-               s = s.encode(encoding, errors)
-       return s
+               return s
 
-def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
-       if isinstance(s, bytes):
-               if sys.hexversion >= 0x3000000:
+       def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
+               if isinstance(s, bytes):
                        s = str(s, encoding=encoding, errors=errors)
-               else:
+               return s
+else:
+       def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
+               if isinstance(s, unicode):
+                       s = s.encode(encoding, errors)
+               return s
+
+       def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
+               if isinstance(s, bytes):
                        s = unicode(s, encoding=encoding, errors=errors)
-       return s
+               return s
 
 class _unicode_func_wrapper(object):
        """
@@ -189,24 +193,22 @@ class _unicode_func_wrapper(object):
 
                rval = self._func(*wrapped_args, **wrapped_kwargs)
 
-               if isinstance(rval, (bytes, basestring, list, tuple)):
-                       if isinstance(rval, (bytes, basestring)):
-                               rval = _unicode_decode(rval,
-                                       encoding=encoding, errors='replace')
-                       else:
-                               decoded_rval = []
-                               for x in rval:
-                                       try:
-                                               x = _unicode_decode(x, encoding=encoding, errors='strict')
-                                       except UnicodeDecodeError:
-                                               pass
-                                       else:
-                                               decoded_rval.append(x)
-
-                               if isinstance(rval, tuple):
-                                       rval = tuple(decoded_rval)
+               if isinstance(rval, (list, tuple)):
+                       decoded_rval = []
+                       for x in rval:
+                               try:
+                                       x = _unicode_decode(x, encoding=encoding, errors='strict')
+                               except UnicodeDecodeError:
+                                       pass
                                else:
-                                       rval = decoded_rval
+                                       decoded_rval.append(x)
+
+                       if isinstance(rval, tuple):
+                               rval = tuple(decoded_rval)
+                       else:
+                               rval = decoded_rval
+               else:
+                       rval = _unicode_decode(rval, encoding=encoding, errors='replace')
 
                return rval