[Python-Dev] PyDict_GetItem & dict_subscript
Thomas Heller
thomas.heller@ion-tof.com
Wed, 14 Nov 2001 12:20:18 +0100
From: "Thomas Wouters" <thomas@xs4all.net>
>
> While trying to figure out why passing an unhashable object to switch didn't
> cause a TypeError: unhashable object, I found out PyDict_GetItem and
> dict_subscript behave differently in that respect. PyDict_GetItem does:
>
> hash = PyObject_Hash(key);
> if (hash == -1) {
> PyErr_Clear();
> return NULL;
> }
>
> whereas dict_subscript does:
>
> hash = PyObject_Hash(key);
> if (hash == -1)
> return NULL;
>
> PyDict_SetItem and PyDict_DelItem both behave like dict_subscript (that is,
> they propagate the error upwards, instead of clearing the error.) Is this
> intentional ?
It seems so, at least it's documented.
> Why ? :P
Probably because retrieving a value from a dictionary, and trying something
else (after clearing the error) if it fails is so common...
> And what is the 'right' way to do a PyDict_GetItem()
> that gives the proper error-message without relying on the need for that
> particular dict (which could be a subtype that has more or less
> restrictions) to have hashable keys ?
I'd use PyObject_GetItem(), but...
Thomas