[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