123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- # -*- 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_info[0] == 2
- PY3 = sys.version_info[0] == 3
- PY33 = PY3 and sys.version_info[1] >= 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
- if PY33:
- from collections.abc import MutableMapping
- else:
- 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())
|