[Python-Dev] Retrieve an arbitrary element from a set withoutremoving it
steve at pearwood.info
Sat Oct 31 02:29:28 CET 2009
On Sat, 31 Oct 2009 07:27:22 am A.M. Kuchling wrote:
> On Fri, Oct 30, 2009 at 09:37:36PM +0100, Georg Brandl wrote:
> > I don't like this. It gives a set object a hidden state, something
> > that AFAICS no other builtin has.
All objects have a reference count field which is hidden from Python
code. The C API for objects has a flags field which specifies whether
objects are read-only or read/write from Python code.
As of Python 2.6, type objects have an internal method cache. C code can
clear it with PyType_ClearCache(), Python codes can't even see it.
Lists and dicts pre-allocate extra space, and record hidden state of how
much of the space is actually in use. Sets may do the same. File
objects may use internal buffers, with all the state that implies.
> > Iterating over an iterable is
> > what iterators are for.
set.get(), or set.pick() as Wikipedia calls it, isn't for iterating over
sets. It is for getting an arbitrary element from the set.
If the requirement that get/pick() cycles through the sets elements is
the killer objection to this proposal, I'd be willing to drop it. I
thought that was part of the OP's request, but apparently it isn't. I
would argue that it's hardly "arbitrary" if you get the same element
every time you call the method, but if others are happy with that
behaviour, I'm not going to stand in the way.
> It also makes the object thread-unsafe; there's no way for two
> threads to iterate over it at the same time. It's a terrible idea to
> introduce new things that won't work under threaded usage.
I would agree if the purpose of get/pick() was to iterate over the
elements of the set, but that's not the purpose. The purpose is to
return an arbitrary item each time it is called. If two threads get the
same element, that's not a problem; if one thread misses an element
because another thread grabbed it first, that's not a problem either.
If people prefer a random element instead, I have no problem with
that -- personally I think that's overkill, but maybe that's just me.
More information about the Python-Dev