Robert Bradshaw, 03.11.2010 07:29:
> On Tue, Nov 2, 2010 at 10:13 PM, Stefan Behnel wrote:
>> What about something like
>>
>>      cdef class PythonVector2d:
>>          cdef Vector obj
>>          cdef public x from obj.x
>
> I think of "cdef" as something accessible from c. This could be OK it
> did c-level attribute renaming as well. (Hmm... maybe I'd be OK with
> that, but it feels a bit odd to create this alias on the C level.)
>
>> ? I'm wondering if it isn't better to keep the existing attribute syntax
>> than to introduce a new property syntax. Although, a counter argument could
>> be that it isn't really an attribute...
>
> Yep. It's nice to look at the class and be able to visualize its struct.

Agreed.


>> Next try:
>>
>>      cdef class PythonVector2d:
>>          cdef Vector obj:
>>              property x
>>              property readonly y as my_y
>>
>> Makes it clearer where the properties actually come from.
>
> This doesn't allow arbitrary expressions.

Well, you can't allow "arbitrary expressions" since you will end up having 
to assign to them in the setter. You can only allow arbitrary attribute 
paths, which isn't prevented by the above.

We could distinguish between normal and read-only properties, though, and 
allow pretty much arbitrary expressions for the latter. Basically like a 
lambda expression wrapped into a property descriptor.


> On that note, should we
> require an explicit self.obj.x, or is self implicit? (The latter makes
> it impossible to refer to non-attributes, and is bad according to the
> zen of Python...), so I'd lean against this one.

That's a very good idea. Makes it more readable and a lot clearer what 
happens. This also removes the link to C++ as you can access any attribute 
of the type in one way or another.

Would you actually require it to refer to "self", or would you allow 
arbitrary global names? I wouldn't even mind the latter, although maybe 
restricted to static cdef declared names (at least of we generate a setter).


>> Anyway, I won't object to your plain "property ... as ..." proposal above.
>
> Or "property ... from ..." if the name should be first (I don't have a
> strong preference, but the as is a more idiomatic keyword to use
> here).

I think it makes sense to put the name first as the access path can be 
arbitrarily long. It also simplifies the syntax as the keyword "property" 
is then always followed by a name, then either ":" or "from" to distinguish 
the two cases.

We could also use

     property x as if self.obj.x

but I think "from" reads well enough here. ;-)

Stefan
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to