[Tutor] __mul__ for different variable types?

2009-10-04 Thread Warren


I'm a little confused on this one.

I have a Vector class that I want to be able to multiply by either  
another vector or by a single float value.  How would I implement this  
in my override of __mul__ within that class?


Do you check the variable type with a stack of if isinstance  
statements or something?  What is the preferred Python way of doing  
this?


- Warren
(war...@wantonhubris.com)




___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] __mul__ for different variable types?

2009-10-04 Thread Rich Lovely
2009/10/4 Warren war...@wantonhubris.com:

 I'm a little confused on this one.

 I have a Vector class that I want to be able to multiply by either another
 vector or by a single float value.  How would I implement this in my
 override of __mul__ within that class?

 Do you check the variable type with a stack of if isinstance statements or
 something?  What is the preferred Python way of doing this?

 - Warren
 (war...@wantonhubris.com)




 ___
 Tutor maillist  -  tu...@python.org
 To unsubscribe or change subscription options:
 http://mail.python.org/mailman/listinfo/tutor


I think isinstance is probably the most pythonic way of doing this,
and don't forget to add __rmul__ as well, for floats:

try:
from numbers import Real
except NameError:
Real = (int, long, float)

class Vector(object):
#__init__ and other methods ommitted.
def __mul__(self, other):
self * other
if isinstance(other, Vector):
# code for Vector * Vector
elif isinstance(other, Number):
# code for Vector * number
else:
return NotImplemented
def __rmul__(self, other):
other * self
return self.__mul__(other)

Note that I've got no type checking in __rmul__, because if only
Vector * Vector has a different value if the terms are swapped, and
other * self will use other.__mul__ if other is a Vector.

Also note the import at the top:  numbers.Real is an Abstract Base
Class use for all real number types, introduced in Python 2.6, so
simplifies testing types.  See
http://docs.python.org/library/numbers.html for info.  If it's not
there, the code demos another feature of isinstance most people don't
notice: the type argument can be a sequence of types,  so I set Real
to a tuple of all the builtin real number types (that I can remember
off the top of my head) if the import fails.

If you want multiplication to be defined for complex numbers, change
all occurances of Real to Number, and add complex to the tuple.

-- 
Rich Roadie Rich Lovely

There are 10 types of people in the world: those who know binary,
those who do not, and those who are off by one.
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] __mul__ for different variable types?

2009-10-04 Thread Warren


Awesome, Rich, thanks!

- Warren
(war...@wantonhubris.com)




On Oct 4, 2009, at 5:31 PM, Rich Lovely wrote:


2009/10/4 Warren war...@wantonhubris.com:


I'm a little confused on this one.

I have a Vector class that I want to be able to multiply by either  
another

vector or by a single float value.  How would I implement this in my
override of __mul__ within that class?

Do you check the variable type with a stack of if isinstance  
statements or

something?  What is the preferred Python way of doing this?

- Warren
(war...@wantonhubris.com)




___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor



I think isinstance is probably the most pythonic way of doing this,
and don't forget to add __rmul__ as well, for floats:

try:
   from numbers import Real
except NameError:
   Real = (int, long, float)

class Vector(object):
   #__init__ and other methods ommitted.
   def __mul__(self, other):
   self * other
   if isinstance(other, Vector):
   # code for Vector * Vector
   elif isinstance(other, Number):
   # code for Vector * number
   else:
   return NotImplemented
   def __rmul__(self, other):
   other * self
   return self.__mul__(other)

Note that I've got no type checking in __rmul__, because if only
Vector * Vector has a different value if the terms are swapped, and
other * self will use other.__mul__ if other is a Vector.

Also note the import at the top:  numbers.Real is an Abstract Base
Class use for all real number types, introduced in Python 2.6, so
simplifies testing types.  See
http://docs.python.org/library/numbers.html for info.  If it's not
there, the code demos another feature of isinstance most people don't
notice: the type argument can be a sequence of types,  so I set Real
to a tuple of all the builtin real number types (that I can remember
off the top of my head) if the import fails.

If you want multiplication to be defined for complex numbers, change
all occurances of Real to Number, and add complex to the tuple.

--
Rich Roadie Rich Lovely

There are 10 types of people in the world: those who know binary,
those who do not, and those who are off by one.


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor