[Cython] Type inference question

Robert Bradshaw robertwb at math.washington.edu
Sat Nov 26 20:08:44 CET 2011


On Sat, Nov 26, 2011 at 11:00 AM, Vitja Makarov <vitja.makarov at gmail.com> wrote:
> 2011/11/26 Robert Bradshaw <robertwb at math.washington.edu>:
>> On Sat, Nov 26, 2011 at 8:10 AM, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>>> Hi!
>>>
>>> I'm now trying to make inlined generator expressions work again. And I
>>> found strange thing:
>>>
>>> inlined_generator_expression.pyx:
>>>
>>> def range_sum(int N):
>>>    """
>>>    >>> sum(range(10))
>>>    45
>>>    >>> range_sum(10)
>>>    45
>>>    """
>>>    result = sum(i for i in range(N))
>>>    return result
>>>
>>> 'i' is expected to be integer, but it isn't
>>>
>>> So I tried simple example and 'i' is inferred as object:
>>>
>>> def bar(int N):
>>>    cdef int result = 0
>>>    for i in range(N):
>>>        result += i
>>>    return result
>>>
>>> So, I'm wondering should it be inferred as int or not?
>>
>> It's not because it's used in an arithmetic expression that might
>> overflow. You can decorate this with @cython.infer_types(True) or use
>> doubles to get the inference you want.
>>
>
> Ok. So I guess something changed after inlined genexps was disabled:
>
> https://github.com/cython/cython/blob/master/tests/run/inlined_generator_expressions.pyx#L16
>
> This test relies on integer range.

Perhaps. Or perhaps it was implemented in such as way that the
arithmetic was not detected (which would have been a bug).

> I'm also a little bit concerned about MarkAssignments I think it's
> better to merge it with CreateControlFlow.
> For instance, type inference doesn't work for comprehensions and will
> not work for inlined genexprs.

I think it makes sense to merge MarkAssignments into
CreateControlFlow; the former was a simple transform before we had any
control flow.

- Robert


More information about the cython-devel mailing list