2010-12-29 4 views
1

disons que j'ai une classe qui se comporte comme un int pour le monde extérieur, mais en fait c'est un objet mutable qui a une place fixe dans plusieurs structures. Si n est mon objet, je peux le mettre à jour maintenant en écrivant n.update(34), mais je trouve que je veux toujours écrire n = 34 à la place. Je l'ai regardé sur http://docs.python.org/reference/datamodel.html, et ne vois rien comme un _ _ assign _ _ ou _ _ valeur _ _ attribut qui me permettrait de piéger l'opérateur = et me permettre de mettre à jour mon objet plutôt que attribuer un entier à la variable n, jetant mon objet. mieux encore, quand un mutable est dans un tuple t = (m, n), je voudrais mettre à jour mon mutable avec t[1] = 34, mais Python voit cela comme une tentative de modification d'un immutable. Donc, je suppose que la réponse serait, sur la base de ce peu de ce document que j'ai pu grok, que ce que je tente n'est pas Pythonic. donc si je ne peux pas le faire comme je le veux, quelle serait la prochaine meilleure chose? si quelqu'un doit maintenir mon code un jour, ce ne sera pas trop offensant.façon pythonique de modifier un mutable à l'intérieur d'un immutable

Répondre

3

Votre base obj.value = newvalue est fondamentalement la meilleure et la plus compréhensible. Comme vous le supposez, il n'est pas possible de surcharger l'assignation en Python.

Vous pouvez implémenter __call__() sur votre classe pour faire l'affectation, de sorte que vous pouvez simplement faire obj(newvalue). Cependant, il n'est pas du tout clair pour le lecteur occasionnel que c'est une réaffectation.

Une autre idée serait de mettre en œuvre __ilshift__() de sorte que vous pouvez faire obj <<= newval. Cela ressemble au moins à une opération de réaffectation mutante si vous plissez assez fort. Si ce n'était pas un type numérique, je pourrais le considérer. Mais << a une signification bien définie avec int et, puisque vous êtes masquerading comme ce type, il serait IMHO être confus de l'utiliser de cette manière.

+0

merci pour les idées, et pour améliorer ma compréhension limitée de ces concepts. Je vais laisser le code seul pour l'instant, car j'ai encore beaucoup de travail à faire, mais quand viendra le temps de faire une mise à jour, je prendrai une décision. –

Questions connexes