470,815 Members | 1,294 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,815 developers. It's quick & easy.

List operator overloading snag

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
print S1.__or__(S2)

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
**********************
Jul 18 '05 #1
4 2334
Steven Brent wrote:
print S1 or S2 Set: ['s', 'p', 'a', 'm'] # custom __repr__ used but still default
# __or__ behavior, returns first true operand
print S1.__or__(S2)

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
Jul 18 '05 #2
Steven Brent wrote:
...
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
Try this:
print S1 | S2


Paul Prescod

Jul 18 '05 #3
Steven Brent wrote:
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__')
<code for class Set with __or__() method snipped>

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

print S1.__or__(S2)


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).

--
Shalabh
Jul 18 '05 #4
Crikey, is *that* all it was!?
Thanks so much to all who responded so quickly.
Y'all made my day :-)

--SB
Jul 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

16 posts views Thread by Edward Diener | last post: by
2 posts views Thread by pmatos | last post: by
67 posts views Thread by carlos | last post: by
5 posts views Thread by SKumar | last post: by
3 posts views Thread by y-man | last post: by
reply views Thread by mihailmihai484 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.