Re: "Is" is "is" [was: any way to customize the is operator?]
"> Lonnie Princehouse wrote: >> 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: What I think you need is a custom version of the .__eq__ (self,other) method that pierces thru the wrappers to compare the underlying C++ objects. Then test a == b. In Python, 'is' specifically means identity of Python objects. -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
In article <[EMAIL PROTECTED]>, Lonnie Princehouse <[EMAIL PROTECTED]> wrote: > >> 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. Then you need to fix Boost.Python. This cannot and will not get fixed at the Python level -- how can Python possibly know that they are the same objects? -- Aahz ([EMAIL PROTECTED]) <*> http://www.pythoncraft.com/ "19. A language that doesn't affect the way you think about programming, is not worth knowing." --Alan Perlis -- http://mail.python.org/mailman/listinfo/python-list
"Is" is "is" [was: any way to customize the is operator?]
Lonnie Princehouse wrote: >>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 > 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. > I will adopt my usual stance here of unequivocally stating that there is no way you can do what you want to. In the case of the "is" operator you can only expect truth when the left- and right-hand side operands refer to the same object. This strategy is usually sound: typically, before the metaphorical ink has dried on my post some upstart comes along to prove me completely wrong. So, I have done about all I can to help you. It's up to the rest of the community now to prove me wrong (as they have so many times in the past :). regards Steve PS: I'm afraid I couldn't resisit shortening yur odds somewhat by doing what I usually fail to do and examining the source of is_() in Modules/operator.c. I'm afraid it's not looking good ... the result of "is" does appear to depend only on the memory addresses of the two operands being the same: result = (a1 == a2) ? Py_True : Py_False; Py_INCREF(result); sorry ... -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC www.holdenweb.com PyCon TX 2006 www.python.org/pycon/ -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
> 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 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
Re: any way to customize the is operator?
On Thu, 26 Jan 2006 23:26:14 -0800, Lonnie Princehouse wrote: >> (objects are not allowed to lie about who they are, or what they are). > > Dangit! I need to find a less honest programming language. Anyone > have a Perl cookbook handy? ... No, you need a better algorithm. Why did you want to customize "is"? -- Steven. -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
Lonnie Princehouse enlightened us with: > There doesn't seem to be any way to customize the behavior of "is" as > can be done for other operators... why not? Pure logic: A == A or A != A. An object is another object or not. Why would you want to change that? Sybren -- The problem with the world is stupidity. Not saying there should be a capital punishment for stupidity, but why don't we just take the safety labels off of everything and let the problem solve itself? Frank Zappa -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
Lonnie Princehouse wrote: >>(objects are not allowed to lie about who they are, or what they are). > > > Dangit! I need to find a less honest programming language. Anyone > have a Perl cookbook handy? ... > +1 QOTW (approved by a fellow Perl programmer FWIW !-) -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
> (objects are not allowed to lie about who they are, or what they are). Dangit! I need to find a less honest programming language. Anyone have a Perl cookbook handy? ... -- http://mail.python.org/mailman/listinfo/python-list
Re: any way to customize the is operator?
Lonnie Princehouse wrote: > There doesn't seem to be any way to customize the behavior of "is" as > can be done for other operators... why not? because it does "id(a) == id(b)", and there's no way to customize the behaviour of id(). (objects are not allowed to lie about who they are, or what they are). -- http://mail.python.org/mailman/listinfo/python-list
any way to customize the is operator?
There doesn't seem to be any way to customize the behavior of "is" as can be done for other operators... why not? -- http://mail.python.org/mailman/listinfo/python-list