[Cython] Some bugs found while testing cython on django
Robert Bradshaw
robertwb at math.washington.edu
Tue Jun 21 01:14:50 CEST 2011
On Mon, Jun 20, 2011 at 12:14 AM, Stefan Behnel <stefan_ml at behnel.de> 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, but for argument
handling, I'd be OK with falling back to the generic
parse-tuple-and-keywords for this case rather than complicating our
argument unpacking code. Assuming it simplifies things, I'm OK with
not supporting typed arguments of this form.
>> 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?) 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.
>> 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.
- Robert
More information about the cython-devel
mailing list