PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.python > Comment fonctionne un décorateur de fonction ?
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Comment fonctionne un décorateur de fonction ?

Réponse
 
LinkBack Outils de la discussion
Vieux 08/09/2007, 08h57   #1
jean-marc pouchoulon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Comment fonctionne un décorateur de fonction ?

bonjour à tous,
je m'interroge sur la différence entre ces deux codes
je cherche une logique à la transmission de la fonction au décorateur et
au role des () après le décorateur.
Un coup on transmet une fonction , l'autre coup c'est une condition et
la fonction est transmise au wrapper
C'est un peu trop magique pour moi

Merci de vos explications


def require_int (func):
def wrapper (arg):
assert isinstance(arg, int)
return func(arg)
return wrapper

@require_int
def meth (arg):
print arg
meth(1)
meth(a)
------------------------------------------------

def requis(expr):
def undecorateur(function):
def enveloppeur(*__args,**__kw):
assert eval(expr),"un argument svp!"
return function(*__args,**__kw)
return enveloppeur
return undecorateur

@requis("len(__args)==1")
def test(*args):
print args[0]

test("Hello world!")
test("je vous salue","bien bas")
  Réponse avec citation
Vieux 08/09/2007, 12h54   #2
Amaury Forgeot d'Arc
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Comment fonctionne un décorateur de fonction ?

jean-marc pouchoulon a écrit :
> bonjour à tous,
> je m'interroge sur la différence entre ces deux codes
> je cherche une logique à la transmission de la fonction au décorateur et
> au role des () après le décorateur.
> Un coup on transmet une fonction , l'autre coup c'est une condition et
> la fonction est transmise au wrapper
> C'est un peu trop magique pour moi
>
> Merci de vos explications
>
>
> def require_int (func):
> def wrapper (arg):
> assert isinstance(arg, int)
> return func(arg)
> return wrapper
>
> @require_int
> def meth (arg):
> print arg
> meth(1)
> meth(a)
> ------------------------------------------------
>
> def requis(expr):
> def undecorateur(function):
> def enveloppeur(*__args,**__kw):
> assert eval(expr),"un argument svp!"
> return function(*__args,**__kw)
> return enveloppeur
> return undecorateur
>
> @requis("len(__args)==1")
> def test(*args):
> print args[0]
>
> test("Hello world!")
> test("je vous salue","bien bas")


Ce qu'on peut comparer dans ces deux morceaux de code, ce sont les
fonctions "wrapper" et "enveloppeur": elles prennent toutes deux la
place de la fonction à décorer.
On peut aussi mettre en parallèle "require_int" et "undecorateur": elles
prennent la fonction originale en paramètre, et renvoient une autre
fonction à la place. C'est ça, un décorateur.

Et le "requis" du deuxième exemple? cette fonction sert simplement à
créer un décorateur ("undecorateur") spécialisé pour le test demandé.
Alors que "require_int" est un décorateur câblé pour vérifier le type de
l'argument.

Dans tous les cas, quand on ne s'y retrouve plus, on peut se rappeler
qu'un décorateur n'est qu'un truc de syntaxe, et qu'on peut écrire comme
ceci:

def meth(arg):
print arg
meth = require_int(meth)


def test(*args):
print args[0]
test = requis("len(__args)==1")(test)

C'est tout pareil.

--
Amaury
  Réponse avec citation
Vieux 08/09/2007, 12h54   #3
Amaury Forgeot d'Arc
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Comment fonctionne un décorateur de fonction ?

jean-marc pouchoulon a écrit :
> bonjour à tous,
> je m'interroge sur la différence entre ces deux codes
> je cherche une logique à la transmission de la fonction au décorateur et
> au role des () après le décorateur.
> Un coup on transmet une fonction , l'autre coup c'est une condition et
> la fonction est transmise au wrapper
> C'est un peu trop magique pour moi
>
> Merci de vos explications
>
>
> def require_int (func):
> def wrapper (arg):
> assert isinstance(arg, int)
> return func(arg)
> return wrapper
>
> @require_int
> def meth (arg):
> print arg
> meth(1)
> meth(a)
> ------------------------------------------------
>
> def requis(expr):
> def undecorateur(function):
> def enveloppeur(*__args,**__kw):
> assert eval(expr),"un argument svp!"
> return function(*__args,**__kw)
> return enveloppeur
> return undecorateur
>
> @requis("len(__args)==1")
> def test(*args):
> print args[0]
>
> test("Hello world!")
> test("je vous salue","bien bas")


Ce qu'on peut comparer dans ces deux morceaux de code, ce sont les
fonctions "wrapper" et "enveloppeur": elles prennent toutes deux la
place de la fonction à décorer.
On peut aussi mettre en parallèle "require_int" et "undecorateur": elles
prennent la fonction originale en paramètre, et renvoient une autre
fonction à la place. C'est ça, un décorateur.

Et le "requis" du deuxième exemple? cette fonction sert simplement à
créer un décorateur ("undecorateur") spécialisé pour le test demandé.
Alors que "require_int" est un décorateur câblé pour vérifier le type de
l'argument.

Dans tous les cas, quand on ne s'y retrouve plus, on peut se rappeler
qu'un décorateur n'est qu'un truc de syntaxe, et qu'on peut écrire comme
ceci:

def meth(arg):
print arg
meth = require_int(meth)


def test(*args):
print args[0]
test = requis("len(__args)==1")(test)

C'est tout pareil.

--
Amaury
  Réponse avec citation
Vieux 08/09/2007, 19h43   #4
jean-marc pouchoulon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Comment fonctionne un décorateur de fonction ?


> def test(*args):
> print args[0]
> test = requis("len(__args)==1")(test)
>
> C'est tout pareil.
>

ok c'est clair
merci
  Réponse avec citation
Vieux 08/09/2007, 19h43   #5
jean-marc pouchoulon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Comment fonctionne un décorateur de fonction ?


> def test(*args):
> print args[0]
> test = requis("len(__args)==1")(test)
>
> C'est tout pareil.
>

ok c'est clair
merci
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 14h01.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,12860 seconds with 13 queries