[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