[Python-Dev] One obvious way to do interning [Was: Retrieve an arbitrary element from a set without removing it]

Terry Reedy tjreedy at udel.edu
Mon Oct 26 20:20:55 CET 2009

Alexander Belopolsky wrote:
> Changing the subject to reflect branched discussion and forwarding to
> python-ideas where it probably belongs.
> On Mon, Oct 26, 2009 at 12:02 PM, Terry Reedy <tjreedy at udel.edu> wrote:
>> Alexander Belopolsky wrote:
>>> Here is an alternative idea on how storing interned objects in a set
>>> can be supported.  Currently set.add method returns None and has no
>>> effect when set already has an object equal to the one being added.  I
>>> propose to consider changing that behavior to make set.add return the
>>> added object or the set member that is equal to the object being
>>> added.  It is unlikely that many programs rely on the return value
>>> being None (with doctests being a probable exception), so adding this
>>> feature is unlikely to cause much grief.
>> I had exactly the same idea, but did not post because it violates the
>> general rule that mutators return None.
> Is there such a rule?  What about set/dict pop?

The rule perhaps should be restated as 'Collection mutators return None 
or possible an item but not the collection.'

>> On the other hand, the returned
>> value here would not be the mutated collection, so no chaining is possible.

>> And 'add' is clearly intended to change something.
> Is this an argument for or against the proposal?

Mildly for.

>> On the other hand, frozensets do not have an add method.
> However, PySet_Add "works with frozenset instances (like
> PyTuple_SetItem() it can be used to fill-in the values of brand new
> frozensets before they are exposed to other code). "
> <http://docs.python.org/3.1/c-api/set.html#PySet_Add>
> I will experiment with changing  PySet_Add to see how much it would
> break and whether it will be helpful in implementing set-based
> interning of python strings.

Terry Jan Reedy

More information about the Python-Dev mailing list