|
|
- # -*- coding: utf-8 -*-
- #
- # Copyright © 2012-2013 Pierre Raybaut
- # Licensed under the terms of the MIT License
- # (see spyderlib/__init__.py for details)
-
- """
- spyderlib.py3compat
- -------------------
-
- Transitional module providing compatibility functions intended to help
- migrating from Python 2 to Python 3.
-
- This module should be fully compatible with:
- * Python >=v2.6
- * Python 3
- """
-
- from __future__ import print_function
-
- import sys
- import os
-
- PY2 = sys.version[0] == '2'
- PY3 = sys.version[0] == '3'
-
-
- # =============================================================================
- # Data types
- # =============================================================================
- if PY2:
- # Python 2
- TEXT_TYPES = (str, unicode)
- INT_TYPES = (int, long)
- else:
- # Python 3
- TEXT_TYPES = (str,)
- INT_TYPES = (int,)
- NUMERIC_TYPES = tuple(list(INT_TYPES) + [float, complex])
-
-
- # =============================================================================
- # Renamed/Reorganized modules
- # =============================================================================
- if PY2:
- # Python 2
- import __builtin__ as builtins
- import ConfigParser as configparser
- try:
- import _winreg as winreg
- except ImportError:
- pass
- from sys import maxint as maxsize
- try:
- import CStringIO as io
- except ImportError:
- import StringIO as io
- try:
- import cPickle as pickle
- except ImportError:
- import pickle
- from UserDict import DictMixin as MutableMapping
- import thread as _thread
- import repr as reprlib
- else:
- # Python 3
- import builtins
- import configparser
- try:
- import winreg
- except ImportError:
- pass
- from sys import maxsize
- import io
- import pickle
- from collections import MutableMapping
- import _thread
- import reprlib
-
-
- # =============================================================================
- # Strings
- # =============================================================================
- if PY2:
- # Python 2
- import codecs
-
- def u(obj):
- """Make unicode object"""
- return codecs.unicode_escape_decode(obj)[0]
- else:
- # Python 3
- def u(obj):
- """Return string as it is"""
- return obj
-
-
- def is_text_string(obj):
- """Return True if `obj` is a text string, False if it is anything else,
- like binary data (Python 3) or QString (Python 2, PyQt API #1)"""
- if PY2:
- # Python 2
- return isinstance(obj, basestring)
- else:
- # Python 3
- return isinstance(obj, str)
-
-
- def is_binary_string(obj):
- """Return True if `obj` is a binary string, False if it is anything else"""
- if PY2:
- # Python 2
- return isinstance(obj, str)
- else:
- # Python 3
- return isinstance(obj, bytes)
-
-
- def is_string(obj):
- """Return True if `obj` is a text or binary Python string object,
- False if it is anything else, like a QString (Python 2, PyQt API #1)"""
- return is_text_string(obj) or is_binary_string(obj)
-
-
- def is_unicode(obj):
- """Return True if `obj` is unicode"""
- if PY2:
- # Python 2
- return isinstance(obj, unicode)
- else:
- # Python 3
- return isinstance(obj, str)
-
-
- def to_text_string(obj, encoding=None):
- """Convert `obj` to (unicode) text string"""
- if PY2:
- # Python 2
- if encoding is None:
- return unicode(obj)
- else:
- return unicode(obj, encoding)
- else:
- # Python 3
- if encoding is None:
- return str(obj)
- elif isinstance(obj, str):
- # In case this function is not used properly, this could happen
- return obj
- else:
- return str(obj, encoding)
-
-
- def to_binary_string(obj, encoding=None):
- """Convert `obj` to binary string (bytes in Python 3, str in Python 2)"""
- if PY2:
- # Python 2
- if encoding is None:
- return str(obj)
- else:
- return obj.encode(encoding)
- else:
- # Python 3
- return bytes(obj, 'utf-8' if encoding is None else encoding)
-
-
- # =============================================================================
- # Function attributes
- # =============================================================================
- def get_func_code(func):
- """Return function code object"""
- if PY2:
- # Python 2
- return func.func_code
- else:
- # Python 3
- return func.__code__
-
-
- def get_func_name(func):
- """Return function name"""
- if PY2:
- # Python 2
- return func.func_name
- else:
- # Python 3
- return func.__name__
-
-
- def get_func_defaults(func):
- """Return function default argument values"""
- if PY2:
- # Python 2
- return func.func_defaults
- else:
- # Python 3
- return func.__defaults__
-
-
- # =============================================================================
- # Special method attributes
- # =============================================================================
- def get_meth_func(obj):
- """Return method function object"""
- if PY2:
- # Python 2
- return obj.im_func
- else:
- # Python 3
- return obj.__func__
-
-
- def get_meth_class_inst(obj):
- """Return method class instance"""
- if PY2:
- # Python 2
- return obj.im_self
- else:
- # Python 3
- return obj.__self__
-
-
- def get_meth_class(obj):
- """Return method class"""
- if PY2:
- # Python 2
- return obj.im_class
- else:
- # Python 3
- return obj.__self__.__class__
-
-
- # =============================================================================
- # Misc.
- # =============================================================================
- if PY2:
- # Python 2
- input = raw_input
- getcwd = os.getcwdu
- cmp = cmp
- import string
- str_lower = string.lower
- from itertools import izip_longest as zip_longest
- else:
- # Python 3
- input = input
- getcwd = os.getcwd
-
- def cmp(a, b):
- return (a > b) - (a < b)
- str_lower = str.lower
- from itertools import zip_longest
-
-
- def qbytearray_to_str(qba):
- """Convert QByteArray object to str in a way compatible with Python 2/3"""
- return str(bytes(qba.toHex().data()).decode())
-
-
- if __name__ == '__main__':
- pass
|