On Nov 25, 2009, at 12:43 AM, Robert Bradshaw wrote:

> On Nov 24, 2009, at 11:51 PM, Stefan Behnel wrote:
>
>> Robert Bradshaw, 25.11.2009 04:27:
>>> On Nov 24, 2009, at 1:18 PM, Lisandro Dalcin wrote:
>>>>> Joachim Saul, 24.11.2009 20:59:
>>>>>> cdef extern from "Python.h":
>>>>>>    ctypedef class __builtin__.str  [object PyStringObject]:
>>>>>>        pass
>>>>
>>>> Anyway, any good reason for such code to fail in Cython? Should we
>>>> support such declarations of builtin types? I think Cython should  
>>>> be
>>>> able to compile as much Pyrex code as possible.
>>>
>>> I agree, it shouldn't fail (though perhaps there should be a
>>> warning).
>>> The underlying issue is that it doesn't recognize that the user-
>>> declared type could be compatible with the builtin type. We should
>>> recognize this and allow it.
>>
>> I disagree. This would either require us to check the declaration
>> exactly
>> (in which case there would be zero gain at all, as Cython would need
>> to
>> know the complete type declaration already), or it would allow users
>> to
>> declare all sorts of broken things on the type without checking. The
>> latter
>> means that there could be all sorts of surprises for users that see
>> their
>> code work or fail, depending on what they think they have declared.
>
> I'm proposing something much simpler--if the name matches for a
> __builtin__ type, we allow assignment. If the extern declaration is
> erroneous, that will break things, but that's *always* the case with
> extern declarations. In general, a gcc error means check your extern
> declarations. (We should warn that a builtin type is being  
> overridden.)
>
>> I think the right way to handle this would be to finish up subtyping
>> support and type fields for builtin types (IIRC, that's what's still
>> missing?),
>
> Yes, we should do this (though I'm doubtful the public and private
> APIs are all consistent from 2.3-3.x).
>
>> and then emit either an error on the above, or a clear warning
>> that states that the senseless redefinition of a builtin type has  
>> been
>> ignored (which IMHO is a very good argument for making it an error).
>
> The users type declaration would not be ignored, it would override the
> builtin one, just like
>
> cdef extern from *:
>     cdef object range(object)
>
> would override the builtin range.

A clarification--I'm not trying to say that I want to make it easy for  
users to write broken code, but I'd rather the user be able to  
override the compiler, even if they're wrong. One of my pet peeves is  
software that says "I know better than you, so I'm ignoring you,"  
especially if I know what I'm doing and am trying to use a corner case  
that it gets wrong.

- Robert

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

Reply via email to