Why this apparent assymetry in set operations?

Colin J. Williams cjw at sympatico.ca
Tue Jan 15 11:25:25 EST 2008


Colin J. Williams wrote:
> Neil Cerutti wrote:
>> On Jan 15, 2008 10:10 AM,  <skip at pobox.com> wrote:
>>> I've noticed that I can update() a set with a list but I can't extend a set
>>> with a list using the |= assignment operator.
>>>
>>>     >>> s = set()
>>>     >>> s.update([1,2,3])
>>>     >>> s
>>>     set([1, 2, 3])
>>>     >>> s |= [4,5,6]
>>>     Traceback (most recent call last):
>>>       File "<stdin>", line 1, in <module>
>>>     TypeError: unsupported operand type(s) for |=: 'set' and 'list'
>>>     >>> s |= set([4,5,6])
>>>     >>> s
>>>     set([1, 2, 3, 4, 5, 6])
>>>
>>> Why is that?  Doesn't the |= operator essentially map to an update() call?
>> No, according to 3.7 Set Types, s | t maps to s.union(t).
>>
> If the RHS is a set then it works OK:
> 
> *** Python 2.5.1 (r251:54863, Apr 18 
> 2007, 08:51:08) [MSC v.1310 32 bit 
> (Intel)] on win32. ***
>>>> import sets
>>>> s1= sets.Set([2, 4, 5])
> Set([2, 4, 5])
>>>> s1= sets.Set([2, 4, 5])
>>>> s2= sets.Set([4, 5, 6])
>>>> s1|s2
> Set([2, 4, 5, 6])
>>>> s1|=s2
>>>> s1
> Set([2, 4, 5, 6])
> 
> It could be modified to handle any 
> iterable on the RHS.
> 
> Colin W.
> 

I'm sorry, there appears to be a bug:
# tSet.py
import sets
s1= sets.Set([1, 2, 3])
s1.union_update([3, 4,5])
print(s1)
s2= sets.Set([6, 7, 8])
s1 |+ s2          # This fails: 
exceptions.TypeError: bad operand type 
for unary +: 'Set'
print s1

Colin W.




More information about the Python-list mailing list