OVH Cloud OVH Cloud

Consensus sur la syntaxe des decorators ?

12 réponses
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour !

Un consensus semble se faire, autour de la proposition de syntaxe J2. Plus
de détails ici :
http://www.aminus.org/rbre/python/pydec.html


Qu'est-ce que la notion de Decorator ? Je n'ai pas bien vu toute la
subtilité de la chose, mais voici ce qu'il me semble être le plus
compréhensible :

Les decorateurs ajoutent des "choses" aux méthodes ou fonctions, au moment
de leur création (à l'exécution du programme). Les "choses" ajoutées peuvent
de deux types :
- des attributs, qui ne modifient pas les classes/méthodes ; par
exemple l'auteur, ou la version ;
- des "meta-fonctions" qui s'appliquent lors de la création de
l'objet.

Les attributs ajoutent des facilités d'introspection, notamment aux
fonctions ; pour les classes, on pouvait déjà utiliser des attributs de
classes, ou des méthodes de classe et des méthodes statiques (à ne pas
confondre avec les méthodes d'instances).

Les "meta-fonctions" fonctionnent comme suit : soit le decorateur MAJ,
défini par ailleurs, et utilisé sur la fonction FONC. Lors de l'exécution du
programme, on aura, pour la création de FONC :
FONC = MAJ(FONC)

Si jamais j'ai mal compris, prière de me le signaler.

Bonne journée
--
Michel Claveau

10 réponses

1 2
Avatar
Rémi
Michel Claveau - abstraction méta-galactique non triviale en fuite
perpétuelle. wrote:

Bonjour !

Un consensus semble se faire, autour de la proposition de syntaxe J2. Plus
de détails ici :
http://www.aminus.org/rbre/python/pydec.html


Qu'est-ce que la notion de Decorator ? Je n'ai pas bien vu toute la
subtilité de la chose, mais voici ce qu'il me semble être le plus
compréhensible :

Les decorateurs ajoutent des "choses" aux méthodes ou fonctions, au moment
de leur création (à l'exécution du programme). Les "choses" ajoutées
peuvent de deux types :
- des attributs, qui ne modifient pas les classes/méthodes ; par
exemple l'auteur, ou la version ;
- des "meta-fonctions" qui s'appliquent lors de la création de
l'objet.

Les attributs ajoutent des facilités d'introspection, notamment aux
fonctions ; pour les classes, on pouvait déjà utiliser des attributs de
classes, ou des méthodes de classe et des méthodes statiques (à ne pas
confondre avec les méthodes d'instances).

Les "meta-fonctions" fonctionnent comme suit : soit le decorateur MAJ,
défini par ailleurs, et utilisé sur la fonction FONC. Lors de l'exécution
du programme, on aura, pour la création de FONC :
FONC = MAJ(FONC)

Si jamais j'ai mal compris, prière de me le signaler.

Bonne journée
La notion de Decorator à t'elle une relation avec le Design Pattern

Decorator ?.

J'ai parfois l'impression que les évolutions futures de Python, vont rendre
plus complexe l'apprentissage de ce language, je n'ai pas encore bien
assimilé les nouvelles techniques de classes de la version 2.3, et surtout
les avantages qu'elles apportent.
Pourvu que ce langage ne devienne pas aussi toufu qu'un langage comme
Java...

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonsoir !

Je suis d'accord : il y a une dérive de Python, qui fait fie de sa clarté et
sa lisibilité originelle, au profit d'une puissance expressive accrue, mais
complexe, qui semble parfois inspirée par la programmation fonctionnelle.

Ceci dit, les notions primordiales (dans le sens primal) de Python
continuent de fonctionner. Ouf !

@-salutations
--
Michel Claveau
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Et, pour ceux qui sont intéressés par une certaine programmation
fonctionnelle, regardez donc ça :
http://candygram.sourceforge.net

Et moi qui appréciait les principes d'Erlang...
(http://www.erlang-fr.org/)
Avatar
Xavier Combelle
Je suis d'accord : il y a une dérive de Python, qui fait fie de sa clarté et
sa lisibilité originelle, au profit d'une puissance expressive accrue, mais
complexe, qui semble parfois inspirée par la programmation fonctionnelle.


Je ne suis pas d'accord:
Le python reste toujours aussi simple pour les taches simples.
Il devient plus simple pour les taches complexes.

La complexité ajoutée n'est utile que lorsqu'on a besoin de mettre
en place les taches complexes. Et relativement aux autres langages,
ces taches complexes restent en général beaucoup plus simples.

De plus, je dirai que les taches complexes très usités deviennent plus
simple: par exemple, les "list comprehension" à la place de la fonction
map, les generateurs à la place des iterateurs, et maintenant les
decorateurs à la plass de l'immonde
maMethode = classPath(maMethode)
syntaxe qui, en plus d'être pas très belle, peut provoquer des erreurs.

--
Xavier
Don't repeat yourself

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour !

Justement, parlons des listes en intension.
Lequel des deux scripts suivants est le plus lisible ?

1)
s='AZERTY'
a = [b for b in s]
print a

2)
s='AZERTY'
a = []
for b in s:
a.append(b)
print a
Avatar
Wilk
"Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle." writes:

Bonjour !

Justement, parlons des listes en intension.
Lequel des deux scripts suivants est le plus lisible ?

1)
s='AZERTY'
a = [b for b in s]
print a

2)
s='AZERTY'
a = []
for b in s:
a.append(b)
print a


Si tu remplace 1) par

print [b for b in 'AZERTY']
ou mieux
print list('AZERTY') (on pourait dire qu'il fait doublon aussi)

tu gagne quand même pas mal de lignes par rapport à 2), ce qui fait que
*l'ensemble du programme* est plus lisible. Même si paradoxalement cette
ligne là est moins lisible...

--
Wilk - http://flibuste.net

Avatar
Meles
Wilk wrote:
tu gagne quand même pas mal de lignes par rapport à 2), ce qui fait que
*l'ensemble du programme* est plus lisible. Même si paradoxalement cette
ligne là est moins lisible...


Bonsoir,
et y a t'i une différence de performance entre les 2 écritures (je me
doutes un peu de la réponse, mais j'aimerai confirmation).

Cordialement

Blaise

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonsoir !


Meles : La liste en intention est plus rapide. Mais ce n'est pas l'objet de
ce débat.



Wilk : si tu veux gagner (un peu) des lignes, il est possible d'écrire :

a=[]
for b in 'AZERTY': a.append(b)
print a

En gardant une excellente lisibilité.



Et puis, si l'on cherche des programmes ultra-court, autant passer à Perl,
ou Ocaml (ou Haskell). Mais alors, la lisibilité semble inversement
proportionnelle au nombre de lignes.

Et puis le nombre de lignes n'est plus considéré comme significatif depuis
les années 70, comme l'a brillamment démontré le langage INTERCAL.

Et puis, pour faire vraiment court, je te conseille le langage BrainFuck :
les programmes ne font toujours qu'une ligne. Mais, là aussi, la lisibilité
est amusante.



@-salutations
--
Michel Claveau
Avatar
Meles
Michel Claveau - abstraction méta-galactique non triviale en fuite
perpétuelle. wrote:
Meles : La liste en intention est plus rapide. Mais ce n'est pas l'objet
de ce débat.

Au risque de paraitre lourd, si j'ai bien tout suivi, la liste en intention

est la méthode numéro 1 des exemples précédent?

Cordialement

Blaise

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
1 2