IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création de décorateurs sioux


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut Création de décorateurs sioux
    Bonjour,

    Dans le cadre de mon framework python, j'aimerais pouvoir faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @trigger.group(ga="1/1/1").changed()
    def rule(event):
        pass
    mais visiblement, ce n'est pas possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ python decorators.py 
      File "decorators.py", line 117
        @trigger.group(ga="1/1/1").changed()
                                  ^
    SyntaxError: invalid syntax
    Est-ce que c'est parce que je n'utilise pas la syntaxe kivabien, ou est-ce vraiment impossible de faire ce genre de chose ?

    Dans ce dernier cas, que me proposeriez-vous ? Je peux bien sûr faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @trigger.group.changed(ga="1/1/1")
    def rule(event):
        pass
    mais c'est moins sioux, car changed() prendra d'autres argument, et ga n'est pas vraiment en relation direct avec cette partie du décorateur... J'aurais aimé bien séparer les choses, tout en conservant une syntaxe sympa.

    Merci d'avance pour vos suggestions.

    PS : pour info, voici comment je comptais procéder pour l'implémentation des décorateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Group():
        def __call__(self, ga=None, id=None):
            # TODO: save ga and id, to be able to use them in the decorating methods
            return self
     
        def changed(self, from_=None, to=None):
            def decorated(func):
                # TODO: register func in the triggering system
                return func
     
            return decorated
     
     
    class Trigger():
        def __init__(self):
            self.group = Group()
     
     
    trigger = Trigger()
    Le truc était de transformer Group an callable, se retournant lui-même, afin de pouvoir accéder à ses méthodes décoratrices...

    Chuis déçu que ça ne puisse pas fonctionner Bouuh !

  2. #2
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Bon, en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    trig = trigger.group(ga="1/1/1").changed()
     
    @trig
    def rule(event):
        pass
    ça marche, mais bon, ça perd quand même beaucoup de son charme

    D'autres suggestions ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    On dirait qu'il s'agit bien d'une limitation du parseur Python. Dans la spécification de la grammaire, on trouve d'ailleurs ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
    Ce qui confirme cette limitation.
    Je ne vois pas de bonne raison à priori, sinon pour simplifier l'analyse syntaxique.
    Ma seule suggestion est de ne pas utiliser de décorateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def rule(event):
        pass
    rule = trigger.group(ga="1/1/1").changed()(rule)

  4. #4
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Bon OK pour la syntaxe. Dommage, tant pis !

    Je peux effectivement faire comme tu préconises, mais c'est moins sympa

    En fait, si je pars là dessus, je n'ai même plus besoin de décorateur du tout : le but est simplement d'enregistrer la fonction dans un table, qui permettra par la suite d'appeler cette fonction suivant des évènements (temps, changement d'état d'un objet KNX ou du système)...

    C'est avant tout la syntaxe des décorateur qui m'intéressait (qui m'intéresse toujours !). Faut que je trouve une autre façon de faire, qui reste quand même conviviale, en limitant le nombre de choses à faire...

    Je vais réfléchir aussi à une autre voie, en définissant une classe et des méthodes, plutôt qu'une simple fonction. Y'a peut-être plus de souplesse à ce niveau.

    Genre métaclass (bien que ce soit un truc que je n'ai jamais utilisé) ? Qu'en pensez-vous ?

    Je rappelle que le but est de fournir quelque chose qui soit facilement utilisable par des non développeurs, et également qui soit clair à relire. Ces scripts de rules seront une bonne partie du coeur de l'appli finale, permettant d'étendre les fonctionalités du bus domotique (genre simulation de présence, ou faire des scénarios complexes, des séquences, etc...).

  5. #5
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    J'ai trouvé une autre façon de contourner le problème, mais qui reste un peu du bricolage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @eval("trigger.group(ga='1/1/1').changed()")
    def rule(event):
        pass

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Citation Envoyé par fma38 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    trig = trigger.group(ga="1/1/1").changed()
     
    @trig
    def rule(event):
        pass
    ça marche, mais bon, ça perd quand même beaucoup de son charme
    Je ferais peut etre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    group = trigger.group(ga="1/1/1")
     
    @group.changed()
    def rule(event):
        pass
    Il faudrait peut etre regarder du cote des frameworks qui realisent une syntaxe declarative (SQLAlchemy par exemple. Ca pourrait vous donner des idees.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Effectivement, cette forme est pas mal. J'envisage même de pouvoir passer une liste de GA au constructeur...

    Je vais regarder SQLAlchemy, pour voir les décorateurs disponibles.

    Merci !

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Citation Envoyé par fma38 Voir le message
    Je vais regarder SQLAlchemy, pour voir les décorateurs disponibles.
    SQLAlchemy, c'est pour le cote interface "declarative" pas pour les decorateurs.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Ah, au temps pour moi....

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36
  3. [Kylix] Création d'un fichier lien
    Par DrQ dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2002, 21h30
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo