Python évangélistes dira la raison pour laquelle Python n'a pas une déclaration de commutateur est parce qu'il a des dictionnaires. Alors ... comment puis-je utiliser un dictionnaire pour résoudre ce problème ici? Le problème est que toutes les valeurs sont en cours d'évaluation et de lever des exceptions en fonction de l'entrée.Python paresseux évaluation du dictionnaire
Ceci est juste un exemple stupide d'une classe qui stocke un nombre ou une liste de nombres et fournit une 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'
Une façon que je pouvais résoudre ce serait un préfixe à chaque valeur avec « lambda » et à après l'appel recherche de dictionnaire de la fonction lambda .... « } (isinsta ...) »
Y a-t-il un meilleur moyen?
Les méthodes qui prennent * n'importe quel type de valeur * sont à peu près la pire chose que vous pouvez faire du point de vue de la POO et c'est pourquoi le code est si moche. –