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