2008/7/21 Jesus Cea <[EMAIL PROTECTED]>: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Trying to find why I can't import bsddb in python3.0, I have found that > this code fails: > > """ > ~ /* Some magic to make DBNotFoundError and DBKeyEmptyError derive > ~ * from both DBError and KeyError, since the API only supports > ~ * using one base class. */ > ~ PyDict_SetItemString(d, "KeyError", PyExc_KeyError); > ~ PyRun_String("class DBNotFoundError(DBError, KeyError): pass\n" > ~ "class DBKeyEmptyError(DBError, KeyError): pass", > ~ Py_file_input, d, d); > ~ DBNotFoundError = PyDict_GetItemString(d, "DBNotFoundError"); > ~ DBKeyEmptyError = PyDict_GetItemString(d, "DBKeyEmptyError"); > ~ PyDict_DelItemString(d, "KeyError"); > """ > > "Some magic" comment is a bit scary :-), although the code seems fairly > obvious. > > This code works in Python 2.x, but fails in 3.0. > > The line that fails is "PyRun_String()". The error is: "ImportError: > __build_class__ not found". > > :-? > > Ideas welcomed! > > The code should work in python2.[3-6] and python3.0. Conditional > compilation can be used. > > PS: Googling around, I see that Python 2.5 allows a tuple being used as > base for exception creation. Is this available in Python3.0?. Searching > for "PyErr_NewException" in 3.0 documentation online shows no results. > > Ok, the index show the function. It should work. > > I'm still interested in knowing WHY the original code fails.
I suppose you just copied the _bsddb.c file from trunk, right? Here is the problem. The current version of _bsddb.c in the py3k branch contains the lines: { PyObject *builtin_mod = PyImport_ImportModule("builtins"); PyDict_SetItemString(d, "__builtins__", builtin_mod); } And indeed __build_class__ is in the __builtins__ module, and seems to be needed by any "class" statement (to implement new metaclass semantics I guess) PyErr_NewException is better in any case. But didn't you try svnmerge? there are other py3k changes you may want to keep. -- Amaury Forgeot d'Arc _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com