Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Suggesting for overloading the assign operator (http://www.velocityreviews.com/forums/t319040-suggesting-for-overloading-the-assign-operator.html)

Rim 07-01-2003 03:31 AM

Suggesting for overloading the assign operator
 
Hi,

I have been thinking about how to overload the assign operation '='.
In many cases, I wanted to provide users of my packages a natural
interface to the extended built-in types I created for them, but the
assign operator is always forcing them to "type cast" or coerce the
result when they do a simple assign for the purpose of setting the
value of a variable. Borrowing an example from this newgroup, the
second assignment below ereases all Currency knowledge from variable
'c', when the user only wanted to update the value of c, not its type:

c=Currency(5)
c=7

I fully understand the workaround of doing c=Curreny(7) instead, but
users don't want to be bothered with that.

I read some of the prior discussions, but I did not see a suggestion
for permanent a solution. I would like to propose the following.

The idea is to separate the value assignment from the type assignment,
by introducing a new operator, let's say the ':=' operator.

'=' remains what it is, assigns type and value at the same time
':=' assigns only the value

For example:

>>> class myint(int): pass

....
>>> a = myint()
>>> a := 6

type(a)
<class '__main__.myint'>
>>> a

6

In reality, := would just coerce the return type of the RHS of := to
the type of the variable on the LHS of the :=, preserving the value(s)
as best as it can.

If the type of the variable was still undefined, ':=' would behave
like '='. It might create confusion in future code, but does not break
old code.

I think it would be a nice feature to have. Comments?

Thanks,
- Rim

Terry Reedy 07-01-2003 04:13 AM

Re: Suggesting for overloading the assign operator
 

"Rim" <rimbalaya@yahoo.com> wrote in message
news:6f03c4a5.0306301931.3f15fbb7@posting.google.c om...
> Hi,
>
> I have been thinking about how to overload the assign operation '='.


Assignment is a statement, not an operator, and therefore not
overloadable . This is an intentional design decision that GvR will
not change.

TJR



Steven Taschuk 07-01-2003 03:22 PM

Re: Suggesting for overloading the assign operator
 
Quoth Rim:
[...]
> The idea is to separate the value assignment from the type assignment,
> by introducing a new operator, let's say the ':=' operator.
>
> '=' remains what it is, assigns type and value at the same time
> ':=' assigns only the value


That's a peculiar way of speaking. '=' does not assign type and
value to a variable; it assigns an object to a name.

[...]
> In reality, := would just coerce the return type of the RHS of := to
> the type of the variable on the LHS of the :=, preserving the value(s)
> as best as it can.


"The type of the variable" is not a meaningful phrase in Python:
names do not have types; objects do. I assume you meant "the type
of the object the name on the lhs is presently bound to".

Coerce how? Do you want a new __magicmethod__ for this operation?

Would ':=' mutate the object presently bound to the lhs name
create a new object and rebind the lhs name? To be concrete:

a = whatever
b = a
a := 7
assert a is b

Should that assertion succeed or fail, in general? (Note that it
fails in general if the ':=' is replaced with '=', even if
whatever == 7.)

Would ':=' support chaining? That is, would
a := b := <some expression>
work? If so, would it be equivalent to
_tmp = <some expression>
a := _tmp
b := _tmp
(except for the namespace pollution), to match the semantics of
chained '='? (Note that the assignments happen left to right.)

Would use of a name on the lhs of a ':=' cause that name to be
considered local, as such use with '=' does?

> If the type of the variable was still undefined, ':=' would behave
> like '='. It might create confusion in future code, but does not break
> old code.


Yikes. Why not raise NameError if the name on the lhs of ':=' is
not yet bound?

> I think it would be a nice feature to have. Comments?


Your example
a = Currency(6)
a := 7
is highly strange. (Even if we ignore the question of *which*
currency is being represented; the example could easily be
restated with, say, FixedPoint or Rational or some such.)

How is it that your users are happy to write Currency(...) when
first assigning to a name, but not happy doing so when assigning
later?

Do they not understand that '=' binds a name to an object? Are
they C programmers who think of assignment as copying a value from
one location in memory to another? Do they think of the first
assignment as a type declaration for the name? (If any of these
three are true, they need to be better educated -- they're all
fundamental misconceptions about Python.)

Do they need a language with syntactic support for Currency
objects?

--
Steven Taschuk staschuk@telusplanet.net
"Our analysis begins with two outrageous benchmarks."
-- "Implementation strategies for continuations", Clinger et al.


John Roth 07-01-2003 04:44 PM

Re: Suggesting for overloading the assign operator
 

"Rim" <rimbalaya@yahoo.com> wrote in message
news:6f03c4a5.0306301931.3f15fbb7@posting.google.c om...
> Hi,
>
> I have been thinking about how to overload the assign operation '='.
> In many cases, I wanted to provide users of my packages a natural
> interface to the extended built-in types I created for them, but the
> assign operator is always forcing them to "type cast" or coerce the
> result when they do a simple assign for the purpose of setting the
> value of a variable.


Use a property. Changing the semantics of the assignment
statement (NOT assignment operator) is not going to happen.

Properties are new in Python 2.2 (which is around a year
old by now.) They enable you to have getter and setter
methods with an interface that looks like an instance
variable.

John Roth



Rim 07-01-2003 05:07 PM

Re: Suggesting for overloading the assign operator
 
"Terry Reedy" <tjreedy@udel.edu> wrote in message news:<coqdnfH2G47kl5yiXTWJkA@comcast.com>...
> "Rim" <rimbalaya@yahoo.com> wrote in message
> news:6f03c4a5.0306301931.3f15fbb7@posting.google.c om...
> > Hi,
> >
> > I have been thinking about how to overload the assign operation '='.

>
> Assignment is a statement, not an operator, and therefore not
> overloadable . This is an intentional design decision that GvR will
> not change.


Well, what about the idea of providing another statement, the one I
proposed in the original post?

'=' statement assigns type and value
':=' statement assigns value only

Rim

Alan Kennedy 07-01-2003 06:01 PM

Re: Suggesting for overloading the assign operator
 
Rim wrote:

> What do you think about providing a statement to assign values
> without assigning type?
>
> '=' statement assigns value and type
> ':=' statement assigns value ony


I think the concept has some merit. I think that sometimes it useful to ensure
that the target of a rebind operation have the same type as the object which was
bound before the rebind.

I know that the same effect can be achieved by descriptors or overriding
"setattr" et al. Or something like this

a = 9
b = 42
if isinstance(b, type(a)):
a = b
else:
raise TypeError("Incompatible types.")

However, these options, i.e. putting type checking logic in "setattr" et al, do
not make it explicit in the code that type enforcement is in place.

Expressing the enforcement syntactically, as Rim suggests, would make it more
explicit for the programmer, as well as providing some extremely useful
optimisation hints, especially for products such as psyco.

Psyco, if I understand it correctly, generates machine code for all paths
through a suite, depending on the types of the objects manipulated in the suite.
Such explicitly stated type enforcement would provide valuable information to
optimisers.

Not that I'm proposing that the OPs solution be adopted. Just that I think he is
addressing a valid concern.

regards,

--
alan kennedy
-----------------------------------------------------
check http headers here: http://xhaus.com/headers
email alan: http://xhaus.com/mailto/alan

Aahz 07-01-2003 06:28 PM

Re: Suggesting for overloading the assign operator
 
In article <6f03c4a5.0306301931.3f15fbb7@posting.google.com >,
Rim <rimbalaya@yahoo.com> wrote:
>
>I have been thinking about how to overload the assign operation '='.
>In many cases, I wanted to provide users of my packages a natural
>interface to the extended built-in types I created for them, but the
>assign operator is always forcing them to "type cast" or coerce the
>result when they do a simple assign for the purpose of setting the
>value of a variable. Borrowing an example from this newgroup, the
>second assignment below ereases all Currency knowledge from variable
>'c', when the user only wanted to update the value of c, not its type:
>
>c=Currency(5)
>c=7
>
>I fully understand the workaround of doing c=Curreny(7) instead, but
>users don't want to be bothered with that.


If you have users who don't want to learn Python, give them a special
Python-like language. I won't say it's trivial, but it's not that hard.
--
Aahz (aahz@pythoncraft.com) <*> http://www.pythoncraft.com/

Usenet is not a democracy. It is a weird cross between an anarchy and a
dictatorship.

John Roth 07-01-2003 09:17 PM

Re: Suggesting for overloading the assign operator
 

"John Roth" <johnroth@ameritech.net> wrote in message
news:vg3eghr5kj1sd8@news.supernews.com...
>
> "Rim" <rimbalaya@yahoo.com> wrote in message
> news:6f03c4a5.0306301931.3f15fbb7@posting.google.c om...
> > Hi,
> >
> > I have been thinking about how to overload the assign operation '='.
> > In many cases, I wanted to provide users of my packages a natural
> > interface to the extended built-in types I created for them, but the
> > assign operator is always forcing them to "type cast" or coerce the
> > result when they do a simple assign for the purpose of setting the
> > value of a variable.

>
> Use a property. Changing the semantics of the assignment
> statement (NOT assignment operator) is not going to happen.
>
> Properties are new in Python 2.2 (which is around a year
> old by now.) They enable you to have getter and setter
> methods with an interface that looks like an instance
> variable.
>
> John Roth


I usually don't reply to my own posts, but I thought it
might be nice if I put up a skeletal example of how to do it.

I'm assuming that what you want is a way of insuring, in a
class named Foo, that the variable fooBar is always bound
to a class instance of Bar, regardless of what the user tries
to assign to it.

Most of what follows is documented in "What's New in Python 2.2,"
section 2: Peps 252 and 253: Type and Class Changes.

The information on the __new__ method is in the document
under 2.5: Related Links.

The way to do this is:

1. Both Foo and Bar have to inherit from a built-in type.
That's usually "object", but it can be any built-in type.

2. Refactor Foo so that all references to self.fooBar
now refer to self._fooBar. (It can be any name; the
underscore is a convention that means "private."

3. Insert the following code in Foo:

def _getFooBar(self):
return self._fooBar

def _setFooBar(self, parm):
self._fooBar = Bar(parm)

_fooBar = property(_setFooBar, _getFoobar, None, "doc strings swing")

4. In class Bar, use the __new__ method to check if
the parameter is an instance of class Bar. If it is, return that
instance, otherwise call your superclass's __new__ method
to create a new object and return it.

5. In class Bar, do whatever type determination you need to
in the __init__ method to build your new Bar object.

Most of this is documented in "What's New in Python 2.2,"
section 2: Peps 252 and 253: Type and Class Changes.

The information on the __new__ method is in the document
under 2.5: Related Links.

HTH

John Roth

>
>




Cliff Wells 07-01-2003 09:50 PM

Re: Suggesting for overloading the assign operator
 
On Mon, 2003-06-30 at 20:31, Rim wrote:

> The idea is to separate the value assignment from the type assignment,
> by introducing a new operator, let's say the ':=' operator.
>
> '=' remains what it is, assigns type and value at the same time
> ':=' assigns only the value


On the surface, this idea seems appealing. However, besides the
arguments that others have forwarded, you might consider the fact that
given two similar "assignment operators", subtle bugs are bound to
arise.

> >>> class myint(int): pass

> ...
> >>> a = myint()
> >>> a := 6

> type(a)
> <class '__main__.myint'>
> >>> a

> 6


What if the programmer accidentally uses '=' rather than ':=' (and I
think this would be a natural mistake)? It would be legal Python but
would probably not have the intended effect. It is not unlike the
"allow assignment in expressions" arguments that come up here every 3.2
weeks.

Anyway, your arguments cancel themselves out. You asked initially for a
way to overload '=' because your users didn't want to have to type
something different. But ':=' *is* different, so what are you really
looking for?. Worse, because ':=' isn't *very* different, it makes
mistakes more likely.

In short, I think using a = myint(6) or even a.value = 6 is preferable.
Besides, when I used Pascal (many years ago), I found ':=' to be one of
the most annoying (and most common) things I had to type. Please don't
ask to bring it back.


Regards,

--
Cliff Wells, Software Engineer
Logiplex Corporation (www.logiplex.net)
(503) 978-6726 (800) 735-0555



Cliff Wells 07-01-2003 09:53 PM

Re: Suggesting for overloading the assign operator
 
On Tue, 2003-07-01 at 11:01, Alan Kennedy wrote:
> Not that I'm proposing that the OPs solution be adopted. Just that I think he is
> addressing a valid concern.


I agree that it is a valid concern. I think, however, that other valid
concerns outweigh this one. I suspect you think so as well, otherwise
you would have omitted the first sentence.

Regards,

--
Cliff Wells, Software Engineer
Logiplex Corporation (www.logiplex.net)
(503) 978-6726 (800) 735-0555




All times are GMT. The time now is 08:18 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.