[Cython] Type inference and C++
mark florisson
markflorisson88 at gmail.com
Mon Jul 23 22:21:19 CEST 2012
On 23 July 2012 20:28, Vitja Makarov <vitja.makarov at gmail.com> wrote:
> 2012/7/23 Vitja Makarov <vitja.makarov at gmail.com>:
>> Here is part of original testcase:
>>
>> from cython.operator cimport dereference as d
>> from cython.operator cimport preincrement as incr
>> from libcpp.vector cimport vector
>>
>> def reverse_iteration_test(L):
>> v = new vector[int]()
>> for a in L:
>> v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> incr(it)
>> print(a)
>>
>> It doesn't work with local type inference enabled since `a` in
>> for-loop is infered as pyobject and in while loop it's inferred as
>> reverse_iterator.
>>
>> Then I tried to comment out for loop and compile it with
>> upstream/master, same error here:
>>
>> note: cpp_stl_vector.pyx:8:6: inferred 'v' to be of type 'vector[int] *'
>> note: cpp_stl_vector.pyx:11:7: inferred 'it' to be of type 'reverse_iterator'
>> note: cpp_stl_vector.pyx:13:10: inferred 'a' to be of type 'reverse_iterator'
>>
>> Error compiling Cython file:
>> ------------------------------------------------------------
>> ...
>> v = new vector[int]()
>> #for a in L:
>> # v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> ^
>> ------------------------------------------------------------
>>
>> cpp_stl_vector.pyx:13:13: Cannot assign type 'int &' to 'reverse_iterator'
>>
>> Error compiling Cython file:
>> ------------------------------------------------------------
>> ...
>> # v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> incr(it)
>> print(a)
>> ^
>> ------------------------------------------------------------
>>
>> cpp_stl_vector.pyx:15:15: Cannot convert 'reverse_iterator' to Python object
>>
>>
>> I think it's not correct to infer `a` as reverse_iterator because it's
>> not an iterator it's vector's item.
>>
>
> It seems that dereference is the only way we can get iterator's value,
> but UnopNode doesn't respect overloaded operator*()
>
I thought unary * was only used for argument unpacking and consuming
left-over items when unpacking an iterable.
>
> --
> vitja.
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel
More information about the cython-devel
mailing list