[C++-sig] Re: C++ Python Scope Problems
Chris Targett
xin at xlevus.net
Thu Nov 25 05:57:33 CET 2004
On Wed, 24 Nov 2004 19:26:26 -0500, David Abrahams wrote:
> "Ralf W. Grosse-Kunstleve" <rwgk at yahoo.com> writes:
>
>> --- Chris Targett <xin at xlevus.net> wrote:
>>
>>> I see. But if i do:
>>>
>>> import libHg # name of C++ library
>>> foo = libHg.Test()
>>> print id(foo.var1), foo.var1
>>> foo.var1 += 1
>>> print id(foo.var1), foo.var1
>>>
>>> I get
>>> 135523772 0
>>> 135523760 1
>>>
>>> Which clearley shows the varible is 'rebound'
>>
>> I got me worried..., but what you show above works correctly as one would
>> expect. However, it has not much to do with your original problem. When you
>> don't get the expected result you are doing something far more complex:
>>
>> PyObject *pFunc = getPyFunc("testScript","testFunction");
>> call<void>(pFunc, this);
>>
>> David, please correct me if I am wrong: I think the call<>() must create a
>> temporary Python object with a copy of "this". The temporary disappears at the
>> end of the function call.
>
> Correct.
>
>> David, is there a way to create a temporary with a pointer to "this", e.g.
>> call<void>(pFunc, *this);
>> ?
>
> Of course:
>
> call<void>(pFunc, boost::python::ptr(this));
Ah, Exactly what I wanted to do, works a charm.
>
>> To the OP: as in real life, there are good and bad neighborhoods. In
>> my judgement you are in a bad neighborhood. If you call Python from
>> C++ I am wondering why you are in C++ in the first place. There will
>> not be much of a speed gain compared to a pure Python solution.
>
> Not everybody does this for speed, though.
>
>> Here is a simple rule that works very well for me:
>>
>> Never call Python from C++.
>
> It doesn't work for anyone who has a C++ library with virtual
> functions that they want to override from Python. It is often
> acceptable to have your Python subclasses of some base be slow, since
> your C++ derived classes will be fast. If speed matters you can start
> moving those subclasses into C++.
>
> Even if you're not writing subclasses, similar arguments apply to any
> scenario where you call Python from C++ (there's an isomorphism in
> there ;->).
>
>> This side-steps a lot of potential surprises like your original
>> problem. In addition, I'd bet your code will be better organized.
>
> It probably does help to keep things organized, and it's a good idea
> when applicable, especially if performance is very important to you.
> But it doesn't apply to every valid use case.
Thankyou, Even if somebody had to ask the question with the right terms
for me, my question was answered. I'm sorry about my badly worded
questions with the wrong term.. But this fixes things. Cheers.
More information about the Cplusplus-sig
mailing list