> Why did you want to customize "is"?

Well, mostly out of principle ;-)

But also because I'm wrapping a C library which passes around C structs
which are wrapped in shim C++ classes for a Boost.Python layer.  Boost
Python does a marvelous job of translating between Python and C++ data
types; when a C structure is returned, it magically translates that
structure into a Python wrapper.   The problem is that a _new_ Python
wrapper is created every time a pointer is returned, even if a  wrapper
already exists for that particular pointer.

To illustrate:  Suppose you have a function in C++ which is a simple
identity function, e.g.

template <typename T>
T *identity (T *x) {
    return x;
}

Calling the wrapped version of this function from Python will produce a
Python wrapper which represents the same underlying C++ object, but is
not actually the same Python object:

>>> b = identity(a)
>>> b is a
False

I wanted to override the behavior of "is" so that (a is b) would be
True --- which shouldn't have caused a problem, since the wrapper
class's attributes are read-only from Python.  As it is, I've overriden
__cmp__ and __hash__, so at least I get the correct dictionary behavior

>>> mydict = { a : 'something' }
>>> b = identity(a)
>>> b in mydict
True

It's quite possible that there is some way to do this correctly from
the Boost.Python side of things... my understanding of how to use
Boost.Python is minimal.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to