[C++-sig] Inconsistency with Boost.Python code

Robert rcdailey at gmail.com
Thu Oct 9 20:15:35 CEST 2008

Stefan Seefeld wrote:
> Robert wrote:
>> Will this code below work?
>>     boost::python::dict GetNamespace( char const* mod )
>>     {
>>         using namespace boost::python;
>>         dict moduleNamespace( extract<dict>( import( mod ).attr( 
>> "__dict__" ) ) );
>>         return moduleNamespace;
>>     }
>> My main concern is the returned value of "import()" going out of scope 
>> and being destroyed since there are no outstanding references to it, 
>> causing the dict object returned to reference an invalid object. Would 
>> this be a possibility?
> No. moduleNamespace holds a (counted) reference to the module object, so 
> it won't be destroyed (unloaded) while someone still holds references to 
> objects within it.
>> After running the code above I find that it does not work, and I get 
>> the following output from python:
>> TypeError: No to_python (by-value) converter found for C++ type: 
>> struct boost::python::extract<class boost::python::dict>
> That's probably caused by the above code being a little too compact. 
> extract<dict> is actually a distinct type, which provides a conversion 
> operator for 'dict'.  (This two-phase conversion is useful as you may 
> not yet know whether the conversion would succeed, so the extract<> type 
> gives you an opportunity to check that, before actually invoking it.)
> In most circumstances this conversion operator is invoked implicitly by 
> the compiler, but sometimes it isn't.
> A slight change in the syntax should do the trick, such as
> dict moduleNamespace = extract<dict>( import( mod ).attr( "__dict__" ) 
> ); // caution: untested !
> or applying the call operator on the temporary extract<> object:
> dict moduleNamespace(extract<dict>(import(mod).attr("__dict__")(); // 
> caution: untested !
> HTH,
>       Stefan

Do copies occur only between object to dict? or does it also copy from 
dict to dict? or list to list? I'm still not 100% sure if the copy or 
reference counting is deterministic.

Thanks so far for all the help, you've been extremely helpful.

More information about the Cplusplus-sig mailing list