Decorator for computing special cases
This commit is contained in:
@@ -15,7 +15,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
|
||||
from .filters import special_case
|
||||
|
||||
divide_doc = """ Dividing MOs
|
||||
|
||||
@@ -27,7 +27,42 @@ divide_doc = """ Dividing MOs
|
||||
|
||||
divide = Dispatcher("divide", doc=divide_doc)
|
||||
|
||||
def divide_filter(left, right):
|
||||
""" Automatic divide on MO
|
||||
|
||||
>>> a = MOnumber(4)
|
||||
>>> b = MOnumber(1)
|
||||
>>> divide(a, b)
|
||||
<MOnumber 4>
|
||||
>>> a = MOnumber(0)
|
||||
>>> b = MOnumber(1)
|
||||
>>> divide(a, b)
|
||||
<MOnumber 0>
|
||||
>>> a = MOnumber(4)
|
||||
>>> b = MOnumber(0)
|
||||
>>> divide(a, b)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
mapytex.calculus.core.compute.exceptions.DivideError: Division by zero
|
||||
"""
|
||||
try:
|
||||
if left == 0:
|
||||
return left
|
||||
except TypeError:
|
||||
pass
|
||||
try:
|
||||
if right == 1:
|
||||
return left
|
||||
except TypeError:
|
||||
pass
|
||||
try:
|
||||
if right == 0:
|
||||
raise DivideError("Division by zero")
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
@divide.register(MOnumber, MOnumber)
|
||||
@special_case(divide_filter)
|
||||
def monumber_monumber(left, right):
|
||||
""" Divide 2 monumbers and return a MOFraction
|
||||
|
||||
@@ -39,6 +74,7 @@ def monumber_monumber(left, right):
|
||||
return MOFraction(left, right)
|
||||
|
||||
@divide.register(MOnumber, MOFraction)
|
||||
@special_case(divide_filter)
|
||||
def monumber_mofraction(left, right):
|
||||
""" Divide a monumber and a mofraction by inverting MOFraction
|
||||
|
||||
@@ -63,6 +99,7 @@ def monumber_mofraction(left, right):
|
||||
return Tree("*", left, right.inverse())
|
||||
|
||||
@divide.register(MOFraction, MOnumber)
|
||||
@special_case(divide_filter)
|
||||
def mofraction_monumber(left, right):
|
||||
""" Divide a monumber and a mofraction by inverting MOnumber
|
||||
|
||||
@@ -82,6 +119,7 @@ def mofraction_monumber(left, right):
|
||||
return Tree("*", left, right_fraction)
|
||||
|
||||
@divide.register(MOFraction, MOFraction)
|
||||
@special_case(divide_filter)
|
||||
def mofraction_mofraction(left, right):
|
||||
""" Divide two mofractions by inverting right MOFraction
|
||||
|
||||
@@ -99,37 +137,6 @@ def mofraction_mofraction(left, right):
|
||||
"""
|
||||
return Tree("*", left, right.inverse())
|
||||
|
||||
#def divide(left, right):
|
||||
# """ Perform the addition of left and right
|
||||
#
|
||||
# :param left: left MO
|
||||
# :param right: right MO
|
||||
# :returns: Tree or MO
|
||||
#
|
||||
# >>> a = MOnumber(4)
|
||||
# >>> b = MOnumber(6)
|
||||
# >>> divide(a, b)
|
||||
# <MOFraction 4 / 6>
|
||||
# >>> b = MOnumber(0)
|
||||
# >>> divide(a, b)
|
||||
# Traceback (most recent call last):
|
||||
# ...
|
||||
# mapytex.calculus.core.compute.exceptions.DivideError: Division by zero
|
||||
#
|
||||
# """
|
||||
# try:
|
||||
# right.value
|
||||
# except AttributeError:
|
||||
# pass
|
||||
# else:
|
||||
# if right.value == 0:
|
||||
# raise DivideError("Division by zero")
|
||||
#
|
||||
# if right.value == 1:
|
||||
# return left
|
||||
#
|
||||
# return MULFUNCTIONS[(type(left), type(right))](left, right)
|
||||
|
||||
# -----------------------------
|
||||
# Reglages pour 'vim'
|
||||
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
||||
|
||||
Reference in New Issue
Block a user