surcharger l'opérateur '+=' ? [résolu]

surcharger l'opérateur '+=' ? [résolu] - Python - Programmation

Marsh Posté le 01-06-2007 à 08:21:32    

Bonjour à tous et à toutes... et désolé pour le caractère élémentaire de ma question.
 
J'ai besoin de redéfinir le comportement de l'opérateur '+=' pour l'une de mes classes. Le Dive into Python (3.2.5. Using List Operators) me dit que c'est possible mais n'indique pas comment. La liste des opérateurs de Python (http://www.python.org/doc/2.4.1/lib/operator-map.html) ne semble pas connaître cet opérateur.
 
Comment faire ? Merci de votre aide !


Message édité par suizokukan le 01-06-2007 à 20:03:21

---------------
rule #1 : trust the python
Reply

Marsh Posté le 01-06-2007 à 08:21:32   

Reply

Marsh Posté le 01-06-2007 à 08:24:01    

pour mapper un += , ne suffi t il pas de mapper le + ? ( et eventuellement le = )

Reply

Marsh Posté le 01-06-2007 à 12:45:35    

flo850 > merci pour ta réponse, mais je ne crois que ce soit aussi simple. Pourrais-tu détailler ?
 
J'ai une classe C héritée de list et le comportement par défaut de l'opérateur += ne me satisfait pas. Par défaut, l += c (l est une list) exige que c soit iterable, à la différence de l = l + c.
J'aimerais redéfinir += de manière à écrire l += c même quand c n'est pas iterable.
 
Dans Dive Into Python (référence citée dans mon premier post), j'ai lu que += appliqué à une liste était un sucre syntaxique pour la méthode extend(). Pouvez-vous me dire si je suis sur la bonne voie ?
 
Merci d'avance !

Reply

Marsh Posté le 01-06-2007 à 14:58:14    

chez moi, "l + c" avec l étant une liste et c un objet quelconque non liste ça balance une exception [:petrus75]

 

Et encore heureux d'ailleurs, c'est immonde comme idée, si tu veux ajouter "c" à la fin de "l" tu utilises append [:spamafote]

 

C'est pas parce que Python dispose de surcharge d'opérateurs que t'es obligé de l'utiliser pour tout, et franchement t'es surtout pas obligé de l'utiliser pour n'importe quoi :/


Message édité par masklinn le 01-06-2007 à 14:59:10

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-06-2007 à 19:03:10    

Bon, je comprends que j'ai voulu faire une conn***.
 
En fait, je veux créer une classe MOT ayant le même comportement que le type string. Donc pouvoir écrire : (avec, par exemple, la classe LETTRE qui joue le même rôle qu'un caractère isolé)
 

Code :
  1. class MOT(list):
  2.     pass
  3. class LETTRE(object):
  4.     pass
  5. lettre_a = LETTRE('a')
  6. lettre_b = LETTRE('b')
  7. mot = MOT(lettre_a)
  8. # 2 manières de l'écrire mais seule la première fonctionne :
  9. mot = mot + lettre_b # ça fonctionne car 'mot + lettre_b' fait appel à MOT.__add__
  10. mot += lettre_b


 
En python, on peut écrire aussi bien l'un que l'autre avec le type string:

Code :
  1. s = ""
  2. s = s + 'a'   # première possibilité
  3. s += 'a'       # deuxième possibilité


 
car dans le deuxième cas 'a' est de type str (donc iterable). Ce n'est pas le cas de mes objets LETTREs.
 
Cela dit, même si mon idée est idiote, je voudrais ne pas mourir idiot : quelle fonction devrait-on surcharger pour réécrire le comportement de += ???
 
Merci !


Message édité par suizokukan le 01-06-2007 à 19:03:57

---------------
rule #1 : trust the python
Reply

Marsh Posté le 01-06-2007 à 19:06:25    

__iadd__ (pour Inplace Add)


Message édité par masklinn le 01-06-2007 à 19:06:50

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-06-2007 à 19:11:21    

> Masklinn : merci pour tes réponses.
 
... et que penses-tu de mon problème ? Est-ce que tu surchargerais += jusqu'à l'absurde (comme ce que je voulais faire) ? ou est-ce que tu imiterais le comportement du type string en n'introduisant que le type MOT,sans créer de type LETTRE (qui es tun type non iterable, qui ne correspond à rien en Python puisque le type 'car' n'existe pas ?)
 
Promis, après j'arrête le flood !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 01-06-2007 à 19:15:00    

À quoi sert ton type "mot", pour commencer [:petrus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-06-2007 à 19:53:56    

Bon, ok, Masklinn, je balance les détails :
 
Je développe un analyseur syntaxique pour langues anciennes (que personne ne se foute de moi, svp  :D  ). Je fais donc sans arrêt des manipulations sur des bouts de mots, de phrases... Dans ces langues, un 'caractère' dépend de la langue utilisée et souvent on ne peut le réduire au type 'string'. Dans certaines langues par exemple, un caractère est une association [consonne+voyelle+accent].
 
J'ai donc une classe LETTRE. La classe MOT est une liste de plusieurs objets LETTRE. Pour simplifier mon code, j'aimerais bien que mes objets MOTs se comportent comme le type string.
 
Je vais prendre l'exemple de mots latins. Je voudrais écrire, comme si je traitais des string :
 

Code :
  1. # initialisation à partir d'une chaîne unicode :
  2. mot = MOT( u"aqua" ) 
  3. # ou initialisation à partir d'objets LETTREs qui ont été initialisés
  4. # à partir de caractères unicode :
  5. mot = MOT( LETTRE("a" )+LETTRE("q" ) + LETTRE("u" ) + LETTRE("a" ))
  6.                        
  7. # exemples de manipulation de l'objet mot1 :
  8. print mot[-1]     # affiche un objet MOT = 'a'
  9. print mot[0:2]   # affiche un objet MOT = 'aq'
  10. mot = mot + 'm' # mot doit valoir 'aquam'
  11. # ce que j'aimerais aussi écrire :
  12. mot += 'm'


On va dire que ça me simplifierait la tâche si je pouvais écrire les choses ainsi et 'oublier' mes objets pour avoir l'impression que je manipule des strings. Je peux balancer du vrai code si tu veux voir les choses de plus près.
 
Merci de t'être penché sur la question !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 01-06-2007 à 20:21:17    

suizokukan a écrit :

Je développe un analyseur syntaxique pour langues anciennes (que personne ne se foute de moi, svp  :D  ). Je fais donc sans arrêt des manipulations sur des bouts de mots, de phrases... Dans ces langues, un 'caractère' dépend de la langue utilisée et souvent on ne peut le réduire au type 'string'. Dans certaines langues par exemple, un caractère est une association [consonne+voyelle+accent].


Normalement tous les glyphes dont tu peux avoir besoin sont dispos en unicode non? Il y en a qui manquent?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-06-2007 à 20:21:17   

Reply

Marsh Posté le 01-06-2007 à 20:39:07    

Non, la norme unicode est très complète.
 
Mais pour manipuler facilement les informations contenues dans chaque caractère, j'ai besoin de créer une entité abstraite (ma classe LETTRE) qui peut avoir plusieurs représentations unicode selon le degré de précision exigé. De même un même mot peut avoir plusieurs représentations.
 
[Pour garder l'exemple du latin, le mot nature peut s'écrire aussi bien NĀTV̄RA , NATVRA, NATURA, natura... ]
 
De plus certains caractères n'ont aucune représentation unicode; par exemple un séparateur de mots peut être représenté par un espace ou par d'autres symboles.  
 
J'ai donc besoin d'une classe LETTRE assez abstraite; une liste d'objets LETTRE forme donc un objet MOT et j'aimerais que cet objet ait le même comportement que le type str/unicode.


---------------
rule #1 : trust the python
Reply

Marsh Posté le 23-06-2007 à 19:36:00    

suizokukan a écrit :

J'ai donc besoin d'une classe LETTRE assez abstraite; une liste d'objets LETTRE forme donc un objet MOT et j'aimerais que cet objet ait le même comportement que le type str/unicode.


Je risque de dire une connerie (je débute en Python) mais tu pourrais pas créer une classe qui hérite de la str/unicode ? Elle aura forcément le même comportement !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed