From d2ab94dda7b397701666f76b69a5e8406432ea1f Mon Sep 17 00:00:00 2001 From: Piotr Maslanka <piotr.maslanka@henrietta.com.pl> Date: Sun, 10 Dec 2017 00:05:19 +0100 Subject: [PATCH] NotInDomainError is better now --- firanka/exceptions.py | 9 +++++++-- firanka/intervals.py | 10 ++++++++++ firanka/series/base.py | 13 ++++--------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/firanka/exceptions.py b/firanka/exceptions.py index d827061..7721760 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 0ed8eb7..a1eee1c 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 aee8b22..381e749 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) -- GitLab