Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1365 connectés 

  FORUM HardWare.fr
  Programmation
  Python

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1568363
suizokukan
Posté le 01-06-2007 à 08:21:32  profilanswer
 

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
mood
Publicité
Posté le 01-06-2007 à 08:21:32  profilanswer
 

n°1568364
flo850
moi je
Posté le 01-06-2007 à 08:24:01  profilanswer
 

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

n°1568550
suizokukan
Posté le 01-06-2007 à 12:45:35  profilanswer
 

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 !

n°1568652
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2007 à 14:58:14  profilanswer
 

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
n°1568787
suizokukan
Posté le 01-06-2007 à 19:03:10  profilanswer
 

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
n°1568788
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2007 à 19:06:25  profilanswer
 

__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
n°1568792
suizokukan
Posté le 01-06-2007 à 19:11:21  profilanswer
 

> 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
n°1568795
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2007 à 19:15:00  profilanswer
 

À 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
n°1568815
suizokukan
Posté le 01-06-2007 à 19:53:56  profilanswer
 

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
n°1568825
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2007 à 20:21:17  profilanswer
 

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
mood
Publicité
Posté le 01-06-2007 à 20:21:17  profilanswer
 

n°1568833
suizokukan
Posté le 01-06-2007 à 20:39:07  profilanswer
 

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
n°1578399
Sve@r
Posté le 23-06-2007 à 19:36:00  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

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

 

Sujets relatifs
Problème de Makefile [Résolu][Résolu] Ajax - [object HTMLTextAreaElement]
[JAVASCRIPT] chargement fichier lors de lappel d'une fonction[Résolu] Problème avec Firefox
[resolu] Apache et php : Pages qui ne s'affichent pas.[Résolu] Créer macro importé un .csv dans excel
[RESOLU] FPDF probleme mise en page tableau[RESOLU]Calcul nombre de jours ouvrables entre 2 dates
Comment organiser la superposition de QLabel (Résolu)problème avec flash et Internet explorer [RESOLU]
Plus de sujets relatifs à : surcharger l'opérateur '+=' ? [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR