Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Ordre dans le pattern observer avec des décorateurs

+2 votes

Voici une légère altération du code présenté par Sam dans son article pattern observer en utilisant les décorateurs:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def evenement(nom):

    # on assure que la liste des events et callabcks est initialisae
    evenement.abonnements = getattr(evenement, 'abonnements', {})


    # définition du décorateur lui-même
    def decorateur(func):

        # on ajoute la fonction comme callback pour cet event
        evenement.abonnements.setdefault(nom, []).append(func)

        # et on retourne la fonction telle qu'elle, sans la modifier
        return func

    return decorateur

    # on ajoute un moyen d'appeler tous les callbacks pour un event
    evenement.trigger = lambda e: [f(e) for f in evenement.abonnements[e]]

# a chaque fois qu'on met le decorateur
# la fonction est liae à un événement
@evenement('evenement1')
@evenement('evenement2')
def reagir_a_evenement(evenement):
    # la fonction doit acccepter l'evenement en paramètre
    print("Oh, evenement '%s' a eu lieu" % evenement)

@evenement('evenement1')
def moi_aussi(evenement):
    print("Cool, moi aussi j'ai reagit a l'evenement '%s'" % evenement)

# ici on déclenche l'événement sans raison
# mais dans du vrai code on le déclenche à la suite
# d'une action réelle
evenement.trigger('evenement1')
evenement.trigger('evenement2')

J’ai juste déplacé trigger après le décorateur et du coup à l’exécution j’ai:

AttributeError: 'function' object has no attribute 'trigger'

Pourquoi ce déplacement casse tout ?

demandé 11-Mai-2016 par Ryzz (208 points)

1 Réponse

+1 vote
 
Meilleure réponse

Tu as un return juste avant ton evenement.trigger = qui du coup n'est jamais exécuté.

répondu 11-Mai-2016 par Sam (4,984 points)
sélectionné 11-Mai-2016 par Ryzz
Pourquoi dans ce cas j’ai un AttributeError ?
...