[Python-Dev] {}.popitem() (was Re: {}.first[key,value,item] ...)

Greg Stein gstein@lyra.org
Fri, 8 Dec 2000 15:26:51 -0800


On Fri, Dec 08, 2000 at 01:43:39PM -0500, Guido van Rossum wrote:
>...
> Comments please!  We could:
> 
> - Live with the pathological cases.

I agree: live with it. The typical case will operate just fine.

> - Forget the whole thing; and then also forget about firstkey()
>   etc. which has the same problem only worse.

No opinion.

> - Fix the algorithm. Maybe jumping criss-cross through the hash table
>   like lookdict does would improve that; but I don't understand the
>   math used for that ("Cycle through GF(2^n)-{0}" ???).

No need. The keys were inserted randomly, so sequencing through is
effectively random. :-)

>...
> static PyObject *
> dict_popitem(dictobject *mp, PyObject *args)
> {
> 	static int finger = 0;
> 	int i;
> 	dictentry *ep;
> 	PyObject *res;
> 
> 	if (!PyArg_NoArgs(args))
> 		return NULL;
> 	if (mp->ma_used == 0) {
> 		PyErr_SetString(PyExc_KeyError,
> 				"popitem(): dictionary is empty");
> 		return NULL;
> 	}
> 	i = finger;
> 	if (i >= mp->ma_size)
> 		ir = 0;

Should be "i = 0"

Cheers,
-g

-- 
Greg Stein, http://www.lyra.org/