diff --git a/firanka/exceptions.py b/firanka/exceptions.py index d827061af5c53c1d0bd540a7bb068e6b5e92b43d..772176086a4f77f43b2f042e594f7cfef9dea8d9 100644 --- a/firanka/exceptions.py +++ b/firanka/exceptions.py @@ -14,11 +14,16 @@ class FirankaError(Exception): """ -class DomainError(FirankaError): +class DomainError(FirankaError, ValueError): """Has something to do with the domain :)""" -class NotInDomainError(DomainError, ValueError): +class NotInDomainError(DomainError): """ Requested index is beyond this domain """ + + def __init__(self, index, domain): + super(NotInDomainError, self).__init__('NotInDomainError: %s not in %s' % (index, domain)) + self.index = index + self.domain = domain diff --git a/firanka/intervals.py b/firanka/intervals.py index 0ed8eb73484b0938f5ea9c51a20378c1b073dac4..a1eee1ca2c4ad406524aff3ad322a6789721bfa0 100644 --- a/firanka/intervals.py +++ b/firanka/intervals.py @@ -5,6 +5,8 @@ import math import six +from .exceptions import NotInDomainError + __all__ = [ 'Interval', 'REAL_SET', @@ -156,6 +158,14 @@ class Interval(object): repr(self.start), repr(self.stop), repr(self.left_inc), repr(self.right_inc)) + def contains_or_fail(self, p): + """ + If p is not in this interval, NotInDomainError will be thrown + :param p: float + """ + if p not in self: + raise NotInDomainError(p, self) + def __getitem__(self, item): if not isinstance(item, slice): raise TypeError('must be a slice') diff --git a/firanka/series/base.py b/firanka/series/base.py index aee8b2297690b3320e437527231b9bd079bfae12..381e749b2b9436b81fef1357f00ed8a50292fbee 100644 --- a/firanka/series/base.py +++ b/firanka/series/base.py @@ -5,7 +5,7 @@ import inspect from sortedcontainers import SortedList -from firanka.exceptions import NotInDomainError, DomainError +from firanka.exceptions import DomainError from firanka.intervals import Interval, EMPTY_SET @@ -39,14 +39,10 @@ class Series(object): if isinstance(item, slice): item = Interval(item) - if item not in self.domain: - raise NotInDomainError('slicing beyond series domain') - + self.domain.contains_or_fail(item) return AlteredSeries(self, domain=self.domain.intersection(item)) else: - if item not in self.domain: - raise NotInDomainError('item not in domain') - + self.domain.contains_or_fail(item) return self._get_for(item) def _get_for(self, item): @@ -82,8 +78,7 @@ class Series(object): domain = domain or Interval(points[0], points[-1], True, True) - if domain not in self.domain: - raise NotInDomainError('points not inside this series!') + self.domain.contains_or_fail(domain) return DiscreteSeries([(i, self[i]) for i in points], domain)