114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
"""
 | 
						|
    pint.errors
 | 
						|
    ~~~~~~~~~
 | 
						|
 | 
						|
    Functions and classes related to unit definitions and conversions.
 | 
						|
 | 
						|
    :copyright: 2016 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)
 | 
						|
 | 
						|
from .compat import string_types
 | 
						|
 | 
						|
 | 
						|
class DefinitionSyntaxError(ValueError):
 | 
						|
    """Raised when a textual definition has a syntax error.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, msg, filename=None, lineno=None):
 | 
						|
        super(DefinitionSyntaxError, self).__init__()
 | 
						|
        self.msg = msg
 | 
						|
        self.filename = None
 | 
						|
        self.lineno = None
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        mess = "While opening {0}, in line {1}: "
 | 
						|
        return mess.format(self.filename, self.lineno) + self.msg
 | 
						|
 | 
						|
 | 
						|
class RedefinitionError(ValueError):
 | 
						|
    """Raised when a unit or prefix is redefined.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, name, definition_type):
 | 
						|
        super(RedefinitionError, self).__init__()
 | 
						|
        self.name = name
 | 
						|
        self.definition_type = definition_type
 | 
						|
        self.filename = None
 | 
						|
        self.lineno = None
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        msg = "cannot redefine '{0}' ({1})".format(self.name,
 | 
						|
                                                   self.definition_type)
 | 
						|
        if self.filename:
 | 
						|
            mess = "While opening {0}, in line {1}: "
 | 
						|
            return mess.format(self.filename, self.lineno) + msg
 | 
						|
        return msg
 | 
						|
 | 
						|
 | 
						|
class UndefinedUnitError(AttributeError):
 | 
						|
    """Raised when the units are not defined in the unit registry.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, unit_names):
 | 
						|
        super(UndefinedUnitError, self).__init__()
 | 
						|
        self.unit_names = unit_names
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        mess = "'{0}' is not defined in the unit registry"
 | 
						|
        mess_plural = "'{0}' are not defined in the unit registry"
 | 
						|
        if isinstance(self.unit_names, string_types):
 | 
						|
            return mess.format(self.unit_names)
 | 
						|
        elif isinstance(self.unit_names, (list, tuple))\
 | 
						|
                and len(self.unit_names) == 1:
 | 
						|
            return mess.format(self.unit_names[0])
 | 
						|
        elif isinstance(self.unit_names, set) and len(self.unit_names) == 1:
 | 
						|
            uname = list(self.unit_names)[0]
 | 
						|
            return mess.format(uname)
 | 
						|
        else:
 | 
						|
            return mess_plural.format(self.unit_names)
 | 
						|
 | 
						|
 | 
						|
class DimensionalityError(ValueError):
 | 
						|
    """Raised when trying to convert between incompatible units.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, units1, units2, dim1=None, dim2=None, extra_msg=''):
 | 
						|
        super(DimensionalityError, self).__init__()
 | 
						|
        self.units1 = units1
 | 
						|
        self.units2 = units2
 | 
						|
        self.dim1 = dim1
 | 
						|
        self.dim2 = dim2
 | 
						|
        self.extra_msg = extra_msg
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        if self.dim1 or self.dim2:
 | 
						|
            dim1 = ' ({0})'.format(self.dim1)
 | 
						|
            dim2 = ' ({0})'.format(self.dim2)
 | 
						|
        else:
 | 
						|
            dim1 = ''
 | 
						|
            dim2 = ''
 | 
						|
 | 
						|
        msg = "Cannot convert from '{0}'{1} to '{2}'{3}" + self.extra_msg
 | 
						|
 | 
						|
        return msg.format(self.units1, dim1, self.units2, dim2)
 | 
						|
 | 
						|
 | 
						|
class OffsetUnitCalculusError(ValueError):
 | 
						|
    """Raised on ambiguous operations with offset units.
 | 
						|
    """
 | 
						|
    def __init__(self, units1, units2='', extra_msg=''):
 | 
						|
        super(ValueError, self).__init__()
 | 
						|
        self.units1 = units1
 | 
						|
        self.units2 = units2
 | 
						|
        self.extra_msg = extra_msg
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        msg = ("Ambiguous operation with offset unit (%s)." %
 | 
						|
               ', '.join(['%s' % u for u in [self.units1, self.units2] if u])
 | 
						|
               + self.extra_msg)
 | 
						|
        return msg.format(self.units1, self.units2)
 |