[Python-Dev] PySet API

Raymond Hettinger raymond.hettinger at verizon.net
Sun Mar 26 17:38:30 CEST 2006


[Alex]
>  And I'm on the fence regarding the specific issue  of PySet_Next.
>
> So, having carefully staked out a position smack in the middle, I
> cheerfully now expect to be fired upon from both sides!-)

Okay, here's the first cheap shot ;-)  Which of the following pieces of code is 
preferable?  The first loops with the iterator protocol and the second loops 
with the _next protocol.


static long
frozenset_hash(PyObject *self)
{
        PySetObject *so = (PySetObject *)self;
        long h, hash = 0;
        PyObject *it, *key;

        if (so->hash != -1)
                return so->hash;

        it = PyObject_GetIter(self);
        if (it == NULL)
                return -1;

        while ((key = PyIter_Next(it)) != NULL) {
                h = PyObject_Hash(key);
                Py_DECREF(key);
                if (h == -1) {
                        Py_DECREF(it);
                        return -1;
                }
                hash ^= h * 3644798167;
        }
        Py_DECREF(it);
        if (PyErr_Occurred())
                return -1;

        if (hash == -1)
                hash = 590923713L;
        so->hash = hash;
        return hash;
}

static long
frozenset_hash(PyObject *self)
{
        PySetObject *so = (PySetObject *)self;
        long h, hash = 0;
        PyObject *key;
        Py_ssize_t pos = 0;

        if (so->hash != -1)
                return so->hash;

        while (set_next(so, &pos, &key)) {
                h = PyObject_Hash(key);
                if (h == -1) {
                    return -1;
                }
                hash ^= h * 3644798167;
        }

        if (hash == -1)
                hash = 590923713L;
        so->hash = hash;
        return hash;
} 



More information about the Python-Dev mailing list