By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,035 Members | 1,984 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,035 IT Pros & Developers. It's quick & easy.

List operator overloading snag

P: n/a
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
Share this Question
Share on Google+
4 Replies


P: n/a
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

P: n/a
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

P: n/a
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

P: n/a
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.