Thomas Heller wrote: > > 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. Yes, that's intentional. The reason is that historically PyDict_GetItem() was always used in this way by Python's internal code and many extensions. > > Why ? :P > > Probably because retrieving a value from a dictionary, and trying something > else (after clearing the error) if it fails is so common... Right. > > 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... Because of security concerns, the dict must be a read-only dictionary implementation. Using generic APIs is the wrong approach here. Of course, since we don't have a read-only dictionary type, the argument is not relevant to your prototype ;-) I'd suggest to use this construct: if ((value = PyDict_GetItem(key)) == NULL) { if (PyObject_Hash(key) == -1) return NULL; else goto notFound; } -- Marc-Andre Lemburg CEO eGenix.com Software GmbH ______________________________________________________________________ Consulting & Company: http://www.egenix.com/ Python Software: http://www.lemburg.com/python/
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4