[Cython] Some bugs found while testing cython on django
Stefan Behnel
stefan_ml at behnel.de
Tue Jun 21 09:19:43 CEST 2011
Robert Bradshaw, 21.06.2011 01:14:
> On Mon, Jun 20, 2011 at 12:14 AM, Stefan Behnel wrote:
>> Vitja Makarov, 19.06.2011 21:37:
>>>
>>> Trying to compile django I've found some problems:
>>>
>>> 1. It seems that cython currently doesn't support tuples inside args
>>> definition:
>>>
>>> def foo((a, b), c):
>>>
>>> Currently this gives missing argument name and crash inside
>>> CreateControlFlow graph
>>>
>>> cython -X binding=True django/contrib/gis/forms/fields.py -o
>>> django/contrib/gis/forms/fields.c
>>
>> It may be valid Py2-only syntax, but I consider its usage a bug in Django.
>
> I don't know about the parser side of things
Sadly, that's the bigger part of the problem. The parser code for function
arguments is pretty complex because it basically has to parse C syntax at
this point. I tried to implement the parser part before I opened ticket 692
and it turned out to be a major ugliness. Currently, the parser even reads
this without complaining. I don't recall the exact details, but I think it
was because it resembles a part of a C function type declaration or something.
Once we get this through the parser correctly, it won't be all that hard to
implement anymore. However, IMHO, it's a lot of work overall for a dead
feature.
>>> 2. Concatenating unicode and str isn't supported:
>>>
>>> I guess that this is mostly django problem
>>>
>>> Error compiling Cython file:
>>> ------------------------------------------------------------
>>> ...
>>> default_error_messages = {
>>> 'no_geom' : _(u'No geometry value provided.'),
>>> 'invalid_geom' : _(u'Invalid geometry value.'),
>>> 'invalid_geom_type' : _(u'Invalid geometry type.'),
>>> 'transform_error' : _(u'An error occurred when transforming
>>> the geometry '
>>> 'to the SRID of the geometry form field.'),
>>> ^
>>> ------------------------------------------------------------
>>>
>>> django/contrib/gis/forms/fields.py:21:30: Cannot mix string literals
>>> of different types, expected u'', got ''
>>
>> That's a bug in Django. Worth submitting a patch to their bug tracker. It
>> works in this case, but it's not what they want in their code:
>>
>> >>> u'abc\u1234'
>> u'abc\u1234'
>> >>> u'abc' '\u1234'
>> u'abc\\u1234'
>
> This error is only for literals (or otherwise typed value, right?)
This is *only* about string literals and their auto-concatenation by the
parser.
> I might say it's not a bug in their code--the second unicode marker is
> redundant here if you know how things work in Py2.
Right, *if* you know it. So the above will fail to provide the correct
result if someone who happens to be not aware of these details changes the
literal to something that contains a non-ASCII character. And this problem
may or may not show up in a test, as the above is only a text message, even
just an (unlikely?) error message.
Rather error prone, if you ask me. Which lets me suspect that the code was
written by someone who was not aware of the details in the first place.
I must say, I like the error message that Cython outputs here. Would have
caught that problem earlier. :)
>>> 3.Reraise not inside except clause, here is simple example
>>>
>>> def foo():
>>> print 'catched'
>>> raise
>>> try:
>>> raise IndexError
>>> except IndexError:
>>> foo()
>>
>> It would be possible to support this, given that we are compatible with
>> CPython regarding the place where exceptions are stored while being handled.
>> Despite of what I initially thought, this is a feature of both Py2 and Py3,
>> even though I expect it to be rarely used and somewhat error prone.
>
> It's a bit odd, but should still be supported.
Oh, absolutely. I should have stated that clearer.
Stefan
More information about the cython-devel
mailing list