On 11/03/2010 02:16 AM, Robert Bradshaw wrote:
> On Tue, Nov 2, 2010 at 4:36 PM, Brett Calcott<[email protected]> wrote:
>
>> On 2 November 2010 17:17, Robert Bradshaw<[email protected]>
>> wrote:
>>
>>> On Sun, Oct 31, 2010 at 8:44 PM, Brett Calcott<[email protected]>
>>> wrote:
>>>
>>>> 1. Why must I use a *pointer* in my python class?
>>>> cdef class PythonVector2d:
>>>> cdef Vector2d *obj
>>>> There is a default constructor, and I can happily declare it on the stack
>>>> in
>>>> a function. I'm sure I'm missing something here; is there some danger with
>>>> allowing this?
>>>>
>>> It's conceivable that we could allow "stack allocated" members in an
>>> object in the presence default constructors, but that would require
>>> modifying the constructor and destructor to manually initialize and
>>> deconstruct the object when the PyObject* is allocated and reclaimed.
>>>
>> I don't get why you need to manually do it. Doesn't the c++ default
>> construction just do it for you?
>>
> No, because the memory for the class object is allocated deep withing
> the Python library with an ordinary malloc, and the pointers just
> passed around.
>
>
>>>> 2. How hard would it be to automatically forward member access to a
>>>> contained cppclass? Consider the following nasty hack:
>>>> cdef class PythonVector2d:
>>>> cdef public float x, y
>>>> cdef Vector2d *obj
>>>> def __cinit__(self, x, y):
>>>> self.x = x
>>>> self.y = y
>>>> self.obj =<Vector 2d*>x
>>>> ok. That is a bit nasty (I'm sure someone can tell me lots of reasons why I
>>>> shouldn't do this).
>>>>
>>> In reading that code, I'm not sure what your intent is.
>>>
>>>
>> Nastiness explained: Vector2d is a struct with 2 float members. I
>> declare 2 float members in the python object, and then get a pointer
>> to the first of these and cast it to a Vector2d. Assuming that the
>> struct layout is the same in both of these, then accessing members via
>> the cython properties will update the same shared bit of memory that
>> the c++ struct uses.
>>
> If this is just for syntactic sugar, it sound way to messy... I could
> see simplifications of the properties syntax to make Python access
> easier.
>
> On 2 November 2010 20:02, Stefan Behnel<[email protected]> wrote:
>
>> Robert Bradshaw, 02.11.2010 07:17:
>>
>>> On Sun, Oct 31, 2010 at 8:44 PM, Brett Calcott wrote:
>>>
>>>> cdef class PythonVector2d:
>>>> cdef Vector obj
>>>> properties:
>>>> public obj.x as x
>>>> public obj.y as y
>>>>
> <--- snip -->
>
>> For this case, I'd prefer a version entirely without body, maybe even
>>
>> property x = obj.x
>>
>> although the "as" version would also work. However, it's not so clear from
>> the above that both setter and getter get generated, and how you would get
>> only the getter for read-only access, for example. And why not have a
>> "delattr" as well? May make sense in some cases.
>>
> setters, getters, (and delattrs?) would be defined iff they make sense
> on the expression in question. One could imagine
>
> property readonly obj.x as x
>
> or something like that. I'm not a fan of the = sign, as it's no where
> else used for declarations (it's always a statement), unless we do
> something like
>
> public x = property(obj.x)
>
> which reads kind of like a default value.
>
FWIW, I'm in favor of something Python-compatible like
cdef class A:
cdef Vector obj
x = delegate_property(obj, 'x')
or similar, without throwing in new syntax. But it may be too late and I
don't care too much. Remember that "x = property(...)" is already in Python.
Dag Sverre
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev