[Python-Dev] Retrieve an arbitrary element from a set without removing it

Steven D'Aprano steve at pearwood.info
Sat Oct 24 04:07:10 CEST 2009

On Sat, 24 Oct 2009 10:26:27 am Ben Finney wrote:
> Steven D'Aprano <steve at pearwood.info> writes:
> > On Sat, 24 Oct 2009 06:04:12 am Terry Reedy wrote:
> > > fwiw, I think the use case for this is sufficiently rare that it
> > > does not need a separate method just for this purpose.
> >
> > And yet it keeps coming up, again and again... obviously people
> > using sets in code think it has a use-case.
> The desire for this may be obvious, but what seems to be lacking is
> One Obvious Way to Do It.
> I agree that ‘for x in foo_set: break’ is not an Obvious Way.
> > The lack of get() in sets and frozensets is sounding more and more
> > to me like the victory of purity over practicality.
> What would be the input to ‘set.get’?

It wouldn't take any input.

> If it's the value, that makes it rather non-obvious; 

It makes it pointless if it takes the value. If you already have the 
value, why would you need to retrieve it from the set?

> if I already 
> know about ‘dict.get’ which takes the key, I'm not going to be
> thinking about the ‘get’ method if I don't have a key to feed it.
> Once I learn it, I'm going to forget it easily, because it's
> inconsistent with ‘dict.get’. So I don't think that meets the
> “obvious way” criterion.

"get" is such a generic term that I don't believe that is a problem. 
There are already quite a number of get() methods in the 2.6 std lib:

$ grep "def get[(]" *.py
_abcoll.py:    def get(self, key, default=None):
ConfigParser.py:    def get(self, section, option):
ConfigParser.py:    def get(self, section, option, raw=False, 
doctest.py:    def get(self):
mailbox.py:    def get(self, key, default=None):
os.py:            def get(self, key, failobj=None):
pickle.py:    def get(self, i, pack=struct.pack):
Queue.py:    def get(self, block=True, timeout=None):
shelve.py:    def get(self, key, default=None):
sre_parse.py:    def get(self):
threading.py:        def get(self):
UserDict.py:    def get(self, key, failobj=None):
UserDict.py:    def get(self, key, default=None):
weakref.py:    def get(self, key, default=None):
weakref.py:    def get(self, key, default=None):
webbrowser.py:def get(using=None):

I think you over-estimate the degree of confusion people suffer from 
similar sounding methods. I don't think people are confused that 
dict[key] and list[index] have different semantics, and I don't see why 
dict.get(key[, default]) and set.get() would be any different.

But if you don't like get(), spell it differently. There's plenty of 
opportunity for bike-shedding:



> By analogy with ‘list.pop’, the method that takes the “top” item off
> the “stack”, I would expect to see ‘list.peek’ and ‘set.peek’, to see
> the item without altering the container.

You don't need list.peek() because there already is an obvious way to 
retrieve an item from a list without removing it: list[index]. 

Steven D'Aprano

More information about the Python-Dev mailing list