FAQ
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?

--
vitja.

Search Discussions

  • Robert Bradshaw at Nov 26, 2011 at 6:40 pm

    On Sat, Nov 26, 2011 at 8:10 AM, Vitja Makarov 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.

    - Robert
  • Vitja Makarov at Nov 26, 2011 at 7:00 pm

    2011/11/26 Robert Bradshaw <robertwb at math.washington.edu>:
    On Sat, Nov 26, 2011 at 8:10 AM, Vitja Makarov 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.


    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.

    --
    vitja.
  • Robert Bradshaw at Nov 26, 2011 at 7:08 pm

    On Sat, Nov 26, 2011 at 11:00 AM, Vitja Makarov wrote:
    2011/11/26 Robert Bradshaw <robertwb at math.washington.edu>:
    On Sat, Nov 26, 2011 at 8:10 AM, Vitja Makarov 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

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupcython-devel @
categoriespython
postedNov 26, '11 at 4:10p
activeNov 26, '11 at 7:08p
posts4
users2
websitecython.org

2 users in discussion

Vitja Makarov: 2 posts Robert Bradshaw: 2 posts

People

Translate

site design / logo © 2017 Grokbase