At 02:26 PM 12/15/03 -0500, Raymond Hettinger wrote:
On Sun, Dec 14, 2003 at 04:31:09PM -0500, Raymond Hettinger wrote:
I. eval() to accept custom mapping arguments for globals and locals. This makes it possible to write a smart __getitem__ method for applications like spreadsheets or case-insensitive evaluation.
http://mail.python.org/pipermail/python-dev/2002-October/029770.html [and the rest of that thread]
[Jeff Epler]
A 3% slowdown in the common case was considered too big to allow a feature like this to be included. The slowdown might be smaller if the builtin module wasn't allowed to be anything but a dict instance, or might disappear if there were two versions of ceval.c were included, and one used PyObject_ APIs and the other used PyDict_ APIs (as long as only one was fighting for space in the cpu cache, main memory, etc)
Ordinarily, I would say that 3% is a reasonable price to pay for this functionality but there is that pesky pie throwing event coming up.
There is a workaround for this in CPython, which used to be used by Zope, and which I have used on occasion: scan the code object for LOAD_NAME opcodes, and note what names are used by the code block. Then, look up those names in your non-dictionary dictionary, and copy them into a real dictionary. So, it's got to be something pretty specialized to really need PyObject_* APIs instead of PyDict_* APIs in CPython at present. Why penalize *everything* for such an specialized need?