Python evangelists will say why Python does not have a switch statement because it has dictionaries. So ... how can I use a dictionary to solve this problem here? The problem is that all values ββare evaluated differently and throw exceptions depending on the input.
This is just a dumb example of a class that stores a number or list of numbers and provides multiplication.
class MyClass(object):
def __init__(self, value):
self._value = value
def __mul__(self, other):
return {
(False, False): self._value * other._value ,
(False, True ): [self._value * o for o in other._value] ,
(True , False): [v * other._value for v in self._value] ,
(True , True ): [v * o for v, o in zip(self._value, other._value)],
}[(isinstance(self._value, (tuple, list)), isinstance(other._value, (tuple, list)))]
def __str__(self):
return repr(self._value)
__repr__ = __str__
>>> x = MyClass(2.0)
>>> y = MyClass([3.0, 4.0, 5.0])
>>> print x
2.0
>>> print y
[3.0, 4.0, 5.0]
>>> print x * y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __mul__
TypeError: can't multiply sequence by non-int of type 'float'
One way I could solve this is to prefix each value with "lambda:" and after searching the dictionary will call the lambda function ... "} (isinsta ...)"
Is there a better way?
source
share