124 lines
3.1 KiB
Python
124 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
|
|
import tokenize
|
|
|
|
from numbers import Number
|
|
from decimal import Decimal
|
|
|
|
|
|
PYTHON3 = sys.version >= '3'
|
|
|
|
if PYTHON3:
|
|
from io import BytesIO
|
|
string_types = str
|
|
tokenizer = lambda input_string: tokenize.tokenize(BytesIO(input_string.encode('utf-8')).readline)
|
|
|
|
def u(x):
|
|
return x
|
|
|
|
maketrans = str.maketrans
|
|
|
|
long_type = int
|
|
else:
|
|
from StringIO import StringIO
|
|
string_types = basestring
|
|
tokenizer = lambda input_string: tokenize.generate_tokens(StringIO(input_string).readline)
|
|
|
|
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
|
|
|
|
if sys.version_info < (2, 7):
|
|
try:
|
|
import unittest2 as unittest
|
|
except ImportError:
|
|
raise Exception("Testing Pint in Python 2.6 requires package 'unittest2'")
|
|
else:
|
|
import unittest
|
|
|
|
|
|
try:
|
|
from collections import Chainmap
|
|
except ImportError:
|
|
from .chainmap import ChainMap
|
|
|
|
try:
|
|
from collections import TransformDict
|
|
except ImportError:
|
|
from .transformdict import TransformDict
|
|
|
|
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:
|
|
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
|
|
|