List operator overloading snag

Shalabh Chaturvedi shalabh at cafepy.com
Sun Apr 25 13:51:37 EDT 2004


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





More information about the Python-list mailing list