Forum Programmation.python systeme de message ??

Posté par .
Tags : aucun
1
12
août
2010
Il n'y a pas si longtemps, un ami m'a fait une petite introduction a ObjC.
Je n'ai pas ete particulierement seduit, mais il y a bien une chose qui a retenu mon attention. Le systeme de message.

Du coup je me demandais s'il n'etait pas possible d'avoir la meme chose en python.
Je m'explique...

imaginons un cas tres simpliste, du genre


def fonction(x):
if x>0:
return x
else:
return None

resultat = [fonction(x)+1 for x in xrange(-5,5)]


he bien pas de chance, comme l'addition ne fonctionne pas avec None, et bien on aura une belle exception

ce que j'aimerais, c'est un objet NULL, pour lequel n'importe quelle methode renverrait NULL (par example, NULL+1 => NULL, sqrt(NULL) => NULL), ou alors si l'on essaie d'appliquer une methode non definie pour la classe en cours, renvoyer ce NULL.

ainsi, sqrt('ABCDEF') => NULL

ca m'eviterait d'avoir des "if not None" partout dans mon code ^^
  • # errata

    Posté par . Évalué à 1.

    bon en fait, c'est pas NULL, c'est NIL dans Objective C...
    mais on va pas chipoter hein ^^
  • # Il faut le créer

    Posté par (page perso) . Évalué à 1.

    Python est dynamiquement typé... mais fortement typé.
    Si tu veux un type de données avec un comportement de ce genre - un peu particulier - il faut créer une classe ad-hoc.

    Python 3 - Apprendre à programmer en Python avec PyZo et Jupyter Notebook → https://www.dunod.com/sciences-techniques/python-3

    • [^] # Re: Il faut le créer

      Posté par (page perso) . Évalué à 1.

      J'ai un peu réfléchi à ça, et ça n'est que le premier point. Il faut ensuite encadrer toutes les fonctions qui peuvent prendre en paramètre cette classe pour catcher l'exception, et là c'est autre chose…

      À part apply() — qui est deprecated — je ne vois pas trop comment faire ça.

      ( Ou alors il y a une fonctionnalité de python qui m'échappe encore ? )
      • [^] # Re: Il faut le créer

        Posté par . Évalué à 1.

        oui, c'est le probleme qui m'avait saute a la figure quand j'y avais un peu reflechi
        un ami m'a dit que pour faire ca il faudrait en gros tout faire heriter non pas d'object, mais d'une autre classe, ce qui a l'air assez bourrin
        je ne suis pas expert du tout, donc si ca se trouve c'est une anerie ^^
  • # Quelques détails ?

    Posté par . Évalué à 1.

    Il faut voir que les mécanismes d'appel sont très différent entre les 2 langages. Il ne sera pas possible de travailler de la même façon.

    Avant d'avancer des idées de solution, j'aimerais savoir pourquoi tu as ces valeurs nulles et si elles sont significatives pour le reste du traitement.
    • [^] # Re: Quelques détails ?

      Posté par . Évalué à 1.

      Et bien, par exemple un truc idiot.
      J'utilise beaucoup les expressions regulieres, et donc j'ai souvent des objets "match" ou "search".
      Le probleme c'est que quand Python ne trouve pas l'expression reguliere, au lieu de renvoyer un objet il renvoie None.
      Du coup, je dois me coltiner des "if not None" a foison avant d'appeler les fonctions que je veux utiliser sur mes objets match
  • # Exception ?

    Posté par . Évalué à 2.

    Et créer une exception ad-hoc, lancée au plus bas niveau : au lieu d’un return None faire un raise MonException. Et on encadre d’un bloc try au plus au niveau, comme ça pas besoin de touche le code intermédiaire ni d’y placer des if not None.
  • # Monades

    Posté par (page perso) . Évalué à 2.

    Ce que tu veux faire ressemble pas mal à des monades, qui est la méthode habituelle de Haskell pour traiter les exceptions. J'avais vu passer du code python utilisant une telle structure un jour, mais je ne sais plus où.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.