131 lines
3.1 KiB
Python
131 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
pint.compat
|
|
~~~~~~~~~~~
|
|
|
|
Compatibility layer.
|
|
|
|
:copyright: 2013 by Pint Authors, see AUTHORS for more details.
|
|
:license: BSD, see LICENSE for more details.
|
|
"""
|
|
|
|
from __future__ import division, unicode_literals, print_function, absolute_import
|
|
|
|
import sys
|
|
|
|
from io import BytesIO
|
|
from numbers import Number
|
|
from decimal import Decimal
|
|
|
|
from . import tokenize
|
|
|
|
ENCODING_TOKEN = tokenize.ENCODING
|
|
|
|
PYTHON3 = sys.version >= '3'
|
|
|
|
def tokenizer(input_string):
|
|
for tokinfo in tokenize.tokenize(BytesIO(input_string.encode('utf-8')).readline):
|
|
if tokinfo.type == ENCODING_TOKEN:
|
|
continue
|
|
yield tokinfo
|
|
|
|
|
|
if PYTHON3:
|
|
string_types = str
|
|
|
|
def u(x):
|
|
return x
|
|
|
|
maketrans = str.maketrans
|
|
|
|
long_type = int
|
|
else:
|
|
string_types = basestring
|
|
|
|
import codecs
|
|
|
|
def u(x):
|
|
return codecs.unicode_escape_decode(x)[0]
|
|
|
|
maketrans = lambda f, t: dict((ord(a), b) for a, b in zip(f, t))
|
|
|
|
long_type = long
|
|
|
|
try:
|
|
from collections import Chainmap
|
|
except ImportError:
|
|
from .chainmap import ChainMap
|
|
|
|
try:
|
|
from functools import lru_cache
|
|
except ImportError:
|
|
from .lrucache import lru_cache
|
|
|
|
try:
|
|
from logging import NullHandler
|
|
except ImportError:
|
|
from .nullhandler import NullHandler
|
|
|
|
try:
|
|
from itertools import zip_longest
|
|
except ImportError:
|
|
from itertools import izip_longest as zip_longest
|
|
|
|
try:
|
|
import numpy as np
|
|
from numpy import ndarray
|
|
|
|
HAS_NUMPY = True
|
|
NUMPY_VER = np.__version__
|
|
NUMERIC_TYPES = (Number, Decimal, ndarray, np.number)
|
|
|
|
def _to_magnitude(value, force_ndarray=False):
|
|
if isinstance(value, (dict, bool)) or value is None:
|
|
raise TypeError('Invalid magnitude for Quantity: {0!r}'.format(value))
|
|
elif isinstance(value, string_types) and value == '':
|
|
raise ValueError('Quantity magnitude cannot be an empty string.')
|
|
elif isinstance(value, (list, tuple)):
|
|
return np.asarray(value)
|
|
if force_ndarray:
|
|
return np.asarray(value)
|
|
return value
|
|
|
|
except ImportError:
|
|
|
|
np = None
|
|
|
|
class ndarray(object):
|
|
pass
|
|
|
|
HAS_NUMPY = False
|
|
NUMPY_VER = '0'
|
|
NUMERIC_TYPES = (Number, Decimal)
|
|
|
|
def _to_magnitude(value, force_ndarray=False):
|
|
if isinstance(value, (dict, bool)) or value is None:
|
|
raise TypeError('Invalid magnitude for Quantity: {0!r}'.format(value))
|
|
elif isinstance(value, string_types) and value == '':
|
|
raise ValueError('Quantity magnitude cannot be an empty string.')
|
|
elif isinstance(value, (list, tuple)):
|
|
raise TypeError('lists and tuples are valid magnitudes for '
|
|
'Quantity only when NumPy is present.')
|
|
return value
|
|
|
|
try:
|
|
from uncertainties import ufloat
|
|
HAS_UNCERTAINTIES = True
|
|
except ImportError:
|
|
ufloat = None
|
|
HAS_UNCERTAINTIES = False
|
|
|
|
try:
|
|
from babel import Locale as Loc
|
|
from babel import units as babel_units
|
|
HAS_BABEL = True
|
|
HAS_PROPER_BABEL = hasattr(babel_units, 'format_unit')
|
|
except ImportError:
|
|
HAS_PROPER_BABEL = HAS_BABEL = False
|
|
|
|
if not HAS_PROPER_BABEL:
|
|
Loc = babel_units = None
|