[C++-sig] C++ chain method works unexpectedly in Python

Charles Solar charlessolar at gmail.com
Mon Apr 18 02:56:45 CEST 2011


I have a python module written in C++, and the C++ code has a few instances
that involve method chaining.  I was experimenting with python support for
these methods and I found something odd.
However it seems this is more a python eccentricity than Boost Python,
consider the following code sample.

class Test():
    def __init__( self ):
            print "Init"
    def __del__( self ):
            print "Del"
    def foo( self ):
            print "Foo"
            return self
    def bar( self ):
            print "Bar"
            return self

And some sample uses:

>> Test().foo().bar()
Init
Foo
Bar
<__main__.Test instance at 0x2aef40e33998>
>>

Note that __del__ was never called, the object still exists somewhere..
There is another odd thing though, if I repeat the same line, the previous
version gets destroyed and replaced by the new version, but only after the
chain methods are done, eg:

>>> Test().foo().bar()
Init
Foo
Bar
Del                      <-- Old one, NOT the current instance
<__main__.Test instance at 0x2b72bc78d998>
>>

However if I do:

def Tester():
    Test().foo().bar()
    # To make sure del is not called by the function returning
    while True:
            pass

>> Tester()
Init
Foo
Bar
Del
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in Tester
KeyboardInterrupt
>>

That time __del__ was called immediately ( as intended ).

Is there something I should be aware of here?  Some sort of difference
between the global instances and ones defined in a function?  Can I do
anything so global instances are cleaned up immediately like they are inside
functions?

Thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20110417/438b7acc/attachment.html>


More information about the Cplusplus-sig mailing list