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
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to