From 985032b1af312a515a6f78c3dc11b976880747c2 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Thu, 15 Mar 2018 16:37:48 +0300 Subject: [PATCH] type filter for operations --- mapytex/calculus/core/compute/add.py | 19 +++------ mapytex/calculus/core/compute/divide.py | 5 +++ mapytex/calculus/core/compute/multiply.py | 5 +++ mapytex/calculus/core/compute/type_filter.py | 44 ++++++++++++++++++++ 4 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 mapytex/calculus/core/compute/type_filter.py diff --git a/mapytex/calculus/core/compute/add.py b/mapytex/calculus/core/compute/add.py index 88f2aa0..3e4846e 100644 --- a/mapytex/calculus/core/compute/add.py +++ b/mapytex/calculus/core/compute/add.py @@ -15,6 +15,7 @@ from ..MO.mo import MO, MOnumber from ..MO.fraction import MOFraction from .exceptions import AddError from .arithmetic import lcm +from .type_filter import args_are def add(left, right): @@ -40,6 +41,7 @@ def add(left, right): return ADDFUNCTIONS[(type(left), type(right))](left, right) +@args_are(MOnumber, MOnumber) def monumber_monumber(left, right): """ Adding 2 monumbers @@ -55,6 +57,7 @@ def monumber_monumber(left, right): """ return MO.factory(left.value + right.value) +@args_are(MOnumber, MOFraction) def monumber_mofraction(left, right): """ Adding a monumber and a mofraction @@ -72,14 +75,11 @@ def monumber_mofraction(left, right): > / | > 6 | > 5 - """ - if not isinstance(left, MOnumber) or not isinstance(right, MOFraction): - raise AddError(f"Wrong type for left (got {left.__class__.__name__}) \ - or right (got {right.__class__.__name__})") left_fraction = MOFraction(left, MOnumber(1)) return Tree("+", left_fraction, right) +@args_are(MOFraction, MOnumber) def mofraction_monumber(left, right): """ Adding a monumber and a mofraction @@ -98,14 +98,10 @@ def mofraction_monumber(left, right): | > 4 | > 1 """ - - if not isinstance(left, MOFraction) or not isinstance(right, MOnumber): - raise AddError(f"Wrong type for left (got {left.__class__.__name__})" - f"or right (got {right.__class__.__name__})") - right_fraction = MOFraction(right, MOnumber(1)) return Tree("+", left, right_fraction) +@args_are(MOFraction, MOFraction) def mofraction_mofraction(left, right): """ Adding two mofractions @@ -174,11 +170,6 @@ def mofraction_mofraction(left, right): | | > 5 | | > 2 """ - - if not isinstance(left, MOFraction) or not isinstance(right, MOFraction): - raise AddError(f"Wrong type for left (got {left.__class__.__name__})" - f"or right (got {right.__class__.__name__})") - if left.denominator == right.denominator: num = Tree("+", left.numerator, right.numerator) return Tree("/", num, left.denominator) diff --git a/mapytex/calculus/core/compute/divide.py b/mapytex/calculus/core/compute/divide.py index 1a5d38a..e2fa4fa 100644 --- a/mapytex/calculus/core/compute/divide.py +++ b/mapytex/calculus/core/compute/divide.py @@ -14,6 +14,7 @@ from ..tree import Tree from ..MO.mo import MO, MOnumber from ..MO.fraction import MOFraction from .exceptions import DivideError +from .type_filter import args_are def divide(left, right): @@ -47,6 +48,7 @@ def divide(left, right): return MULFUNCTIONS[(type(left), type(right))](left, right) +@args_are(MOnumber, MOnumber) def monumber_monumber(left, right): """ Divide 2 monumbers @@ -61,6 +63,7 @@ def monumber_monumber(left, right): """ return MOFraction(left, right) +@args_are(MOnumber, MOFraction) def monumber_mofraction(left, right): """ Divide a monumber and a mofraction @@ -92,6 +95,7 @@ def monumber_mofraction(left, right): return Tree("*", left, right.inverse()) +@args_are(MOFraction, MOnumber) def mofraction_monumber(left, right): """ Divide a monumber and a mofraction @@ -118,6 +122,7 @@ def mofraction_monumber(left, right): right_fraction = MOFraction(1, right) return Tree("*", left, right_fraction) +@args_are(MOFraction, MOFraction) def mofraction_mofraction(left, right): """ Divide two mofractions diff --git a/mapytex/calculus/core/compute/multiply.py b/mapytex/calculus/core/compute/multiply.py index 37c2316..8990b23 100644 --- a/mapytex/calculus/core/compute/multiply.py +++ b/mapytex/calculus/core/compute/multiply.py @@ -14,6 +14,7 @@ from ..tree import Tree from ..MO.mo import MO, MOnumber from ..MO.fraction import MOFraction from .exceptions import MultiplyError +from .type_filter import args_are def multiply(left, right): @@ -41,6 +42,7 @@ def multiply(left, right): return MULFUNCTIONS[(type(left), type(right))](left, right) +@args_are(MOnumber, MOnumber) def monumber_monumber(left, right): """ Multiply 2 monumbers @@ -56,6 +58,7 @@ def monumber_monumber(left, right): """ return MO.factory(left.value * right.value) +@args_are(MOnumber, MOFraction) def monumber_mofraction(left, right): """ Multiply a monumber and a mofraction @@ -89,6 +92,7 @@ def monumber_mofraction(left, right): num = Tree("*", left, right.numerator) return Tree("/", num, right._denominator) +@args_are(MOFraction, MOnumber) def mofraction_monumber(left, right): """ Multiply a monumber and a mofraction @@ -113,6 +117,7 @@ def mofraction_monumber(left, right): num = Tree("*", left.numerator, right) return Tree("/", num, left._denominator) +@args_are(MOFraction, MOFraction) def mofraction_mofraction(left, right): """ Multiply two mofractions diff --git a/mapytex/calculus/core/compute/type_filter.py b/mapytex/calculus/core/compute/type_filter.py new file mode 100644 index 0000000..64e5417 --- /dev/null +++ b/mapytex/calculus/core/compute/type_filter.py @@ -0,0 +1,44 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# Copyright © 2017 lafrite +# +# Distributed under terms of the MIT license. + +""" +Decorator to filter MO before operate +""" + +from functools import wraps +from .exceptions import ComputeError + +def args_are(left_type, right_type): + """ Decorator which filter arguments type + + :param left_type: class or tuple of class to pass to isinstance for left arg + :param right_type: class or tuple of class to pass to isinstance for right arg + :returns: a decorator which will allow only some type + + """ + def type_filter(func): + @wraps(func) + def filtered_func(left, right): + if not isinstance(left, left_type): + raise ComputeError("Wrong type for left argument" + f"Require {left_type}, got {left.__class__.__name__}" + ) + if not isinstance(right, right_type): + raise ComputeError("Wrong type for right argument" + f"Require {right_type}, got {right.__class__.__name__}" + ) + return func(left, right) + return filtered_func + return type_filter + + + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del