Overloadable Assignment PEP
Drew Moore
drew at astro.pas.rochester.edu
Thu Apr 3 10:05:26 EST 2003
"Anders J. Munch" <andersjm at dancontrol.dk> wrote in message news:<3e8c083b$0$10386$edfadb0f at dread11.news.tele.dk>...
> "Drew Moore" <drew at astro.pas.rochester.edu> wrote:
> > Howdy!
> >
> > I submitted a pre-PEP on overloadable assignment.
> >
> > The idea is:
> >
> > In situations where the assignment token "=" appears, and an augmented
> > assignment symbol (such as +=, -=, *=, etc..) would also be
> > syntactically correct, the assigned-to object would be checked for an
> > __assign__(self, other) method.
>
> You terminology is off. There is no such thing as an "assigned-to"
> object in Python. Assignments change bindings, not objects.
Right, the binding of the name always changes. When an augmented
assignment operator is overloaded, the method must return a
reference to an object, and this returned reference is bound to the
name on the left hand side. Typical code inspects the "other" object,
modifies self appropriately, and returns a reference to self.
Regular assignment is just the trivial case of augmented assignment.
Seems to me a += b -> __iadd__(a,b)
is very similar a = b -> __assign__(a,b)
the __assign__ method returns a reference, just like __iadd__
this reference will be bound to the name on the left hand side.
> Take a step back and tell us what problem you are trying to solve.
> Whatever it is, I'm sure we can think of a better solution than having
> assignment depend on whatever object, if any, happened to be
> previously bound to the same name.
>
> python-is-not-c++-ly y'rs, Anders
my original need?
I wanted to create an object that controls a voltage and
use it at the python command line.
by overloading operators, I can do:
voltage += 5 # (raise the voltage by 5 volts)
voltage *= 2 # (double the current voltage)
but when I do
voltage = 3 # (set the voltage to 3 volts)
my voltage object is clobbered with an integer object.
I don't want to require the user to type any more than
name = value # no name.val = newval, no name.setval(value)
Overloadable augmented assignment provides a nice framework that
always rebinds the name, but gives the "about to be rebound" name
some say in how this takes place. I'm at a loss to explain why
the "most trivial case of augmented assignment" was denied this power.
Thanks for responding.. Maybe posting on April 1st was a mistake,
people might have thought I was joking around!!
More information about the Python-list
mailing list