New submission from Daniel Stutzbach <dan...@stutzbachenterprises.com>:

The set() operators (__or__, __and__, __sub__, __xor__, and their in-place 
counterparts) require that the parameter also be an instance of set().

They're documented that way:  "This precludes error-prone constructions like 
set('abc') &  'cbs' in favor of the more readable 
set('abc').intersection('cbs')."

However, an unintended consequence of this behavior is that they don't 
inter-operate with user-created types that derive from collections.Set.

That leads to oddities like this:

MySimpleSet() | set()  # This works
set() | MySimpleSet()  # Raises TypeError

(MySimpleSet is a minimal class derived from collections.Set for illustrative 
purposes -- set attached file)

collections.Set's operators accept any iterable.

I'm not 100% certain what the correct behavior should be.  Perhaps set's 
operators should be a bit more liberal and accept any collections.Set instance, 
while collections.Set's operators should be a bit more conservative.  Perhaps 
not.  It's a little subjective.

It seems to me that at minimum set() and collections.Set() should inter-operate 
and have the same behavior.

----------
components: Interpreter Core
files: set-vs-set.py
messages: 105929
nosy: stutzbach
priority: normal
severity: normal
stage: unit test needed
status: open
title: set() operators don't work with collections.Set instances
type: behavior
versions: Python 2.7, Python 3.2
Added file: http://bugs.python.org/file17383/set-vs-set.py

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue8743>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to