List operator overloading snag

S

Steven Brent

Dear Group:

I am a little perplexed by a basic example from the O'Reilly book, 2nd ed.,
which demonstrates overloading some builtin list operators by embedding
lists in a wrapper class.

Below is a snippet which shows the wrapper class and the overloaded
operator definition within (in this case, '__or__')

## BEGIN SNIPPET (from setwrapper.py)

class Set:
def __init__(self, value = []):
self.data = []
self.concat(value)

def union(self, other):
res = self.data[:]
for x in other:
if not x in res:
res.append(x)
print 'using Set.__or__' #for debugging
return Set(res)

def __repr__(self):
return 'Set: ' + `self.data` #for debugging

def __or__(self, other):
return self.union(other)

## END SNIPPET

The problem is that I can't seem to get my wrapped lists to use the
overloaded versions of the operators without calling the customize
instance method directly, as shown below:
import setwrapper; from setwrapper import *
S1 = Set(['s','p','a','m'])
S2 = Set(['s','c','a','t'])
print S1 or S2
Set: ['s', 'p', 'a', 'm'] # custom __repr__ used but still default
# __or__ behavior, returns first true operand
using Set.__or__
Set: ['s', 'p', 'a', 'm', 'c', 't'] # now all the custom behaviors

This happens regardless of whether the module is imported into IDLE, or run
standalone. Obviously I'm missing something very basic namespace issue, and
I don't want to gloss over any bumps in my learning curve.

Many thanks.

--
**********************
www.emptydrum.com
....like a think tank
without the thinking
or the tank
**********************
 
S

Shalabh Chaturvedi

Steven said:
Dear Group:

I am a little perplexed by a basic example from the O'Reilly book, 2nd ed.,
which demonstrates overloading some builtin list operators by embedding
lists in a wrapper class.

Below is a snippet which shows the wrapper class and the overloaded
operator definition within (in this case, '__or__')
said:
The problem is that I can't seem to get my wrapped lists to use the
overloaded versions of the operators without calling the customize
instance method directly, as shown below:
import setwrapper; from setwrapper import *
S1 = Set(['s','p','a','m'])
S2 = Set(['s','c','a','t'])
print S1 or S2

Set: ['s', 'p', 'a', 'm'] # custom __repr__ used but still default
# __or__ behavior, returns first true operand


using Set.__or__
Set: ['s', 'p', 'a', 'm', 'c', 't'] # now all the custom behaviors

This happens regardless of whether the module is imported into IDLE, or run
standalone. Obviously I'm missing something very basic namespace issue, and
I don't want to gloss over any bumps in my learning curve.

Many thanks.

Try S1 | S2. The '|' operator (commonly known as the bitwise 'or'
operator for integers) is what gets customized. You cannot change the
meaning of the Python boolean 'or' which returns the left side value if
it is true, else it returns the right side value. So what you're seeing
is normal behavior, you always get the left side value since it's truth
value is true. See also __nonzero__() in the Python docs.

Btw, if you really want sets, you can use builtin module sets (new in 2.3).
 
P

Peter Otten

Steven said:
Set: ['s', 'p', 'a', 'm'] # custom __repr__ used but still default
# __or__ behavior, returns first true operand
using Set.__or__
Set: ['s', 'p', 'a', 'm', 'c', 't'] # now all the custom behaviors

Try S1 | S2 instead, __or__() somewhat misleadingly implements the | aka
"bitwise or" operator.

Peter
 
S

Steven Brent

Crikey, is *that* all it was!?
Thanks so much to all who responded so quickly.
Y'all made my day :)

--SB
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,187
Latest member
RosaDemko

Latest Threads

Top