Python n'a pas une syntaxe particulièrement agréable pour les monades. Cela étant dit, si vous voulez vous limiter à utiliser quelque chose comme la monade Maybe
(ce qui signifie que vous ne serez en mesure d'utiliser Maybe
, vous ne serez pas en mesure de faire des fonctions génériques qui traitent toute monade), vous pouvez utiliser l'approche suivante:
class Maybe():
def andThen(self, action): # equivalent to Haskell's >>=
if self.__class__ == _Maybe__Nothing:
return Nothing
elif self.__class__ == Just:
return action(self.value)
def followedBy(self, action): # equivalent to Haskell's >>
return self.andThen(lambda _: action)
class _Maybe__Nothing(Maybe):
def __repr__(self):
return "Nothing"
Nothing = _Maybe__Nothing()
class Just(Maybe):
def __init__(self, v):
self.value = v
def __repr__(self):
return "Just(%r)" % self.value
Ensuite, faire toutes les méthodes qui retournent actuellement None
retour soit Just(value)
ou Nothing
à la place. Cela vous permet d'écrire ce code:
Person.find(id=12345).andThen(lambda person: Company.find(person.companyId)).andThen(lambda company: Country.find(company.countryId))
Vous pouvez bien sûr adapter les lambdas pour stocker les résultats intermédiaires dans les variables; C'est à vous de voir comment le faire correctement.
Ceci est sans équivoque la réponse correcte pour ce cas spécifique. Tout le but de 'Maybe 'en tant que monade est de modéliser l'approche EAFP explicitement comme une entité de première classe. En Python, il est à la fois implicite et idiomatique sous cette forme, alors utilisez-le! –
Malheureusement, je dois réellement "savoir" qui de la personne ou de l'entreprise sont None. – drozzy
@drozzy: Si vous avez besoin d'exécuter de manière conditionnelle différentes parties de code en fonction des variables 'None', alors évidemment vous avez besoin de conditions. – katrielalex