[Python-ideas] set.add() return value

Steven D'Aprano steve at pearwood.info
Wed Feb 18 00:01:22 CET 2009

Bill Janssen wrote:
> Guido van Rossum <guido at python.org> wrote:
>> This example also has a bug, which neither of the two posters
>> responding caught (unless Bill J was being *very* subtle).
> Sorry, I should have been more brutal.  To my mind, the fact that Steve
> got it wrong was a nice illustration of how much extra mental effort
> needed to be expended because the feature Ralf suggests wasn't
> available.

I'm not excusing my sloppiness, but I think that my mistake is an 
argument against the proposal that add (or in Greg's case, test_and_add) 
should return True if the object was *not* added (because it was already 
there). In other words, despite Greg's suggested name:

was_it_there = myset.test_and_add(42)

I was confused by my intuition that the return flag should mean the 
object was added, and then made the mental translation:

test_and_add() returns True => 42 was added to the set


42 in set returns True => 42 is to be added to the set

which is of course the opposite intention to the proposal but in the 
brief time I spent writing the email easy to make.

I believe that some people will expect to use it like this:

if set.test_and_add(42):
     print "42 was not added because it was already there."

and others like this:

if set.test_and_add(42):
     print "42 was added because it wasn't there."

and yet others (I expect the majority, including me) will flip from one 
to the other and consequently find that 50% of the time they get it wrong.

I think that test_and_add is naturally two operations, not one, and 
forcing it to be one operation will just lead to confusion.


More information about the Python-ideas mailing list