any way to customize the is operator?

Lonnie Princehouse finite.automaton at gmail.com
Fri Feb 10 19:33:37 EST 2006


> 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.




More information about the Python-list mailing list