[Cython] Type inference and C++

Vitja Makarov vitja.makarov at gmail.com
Mon Jul 23 22:58:03 CEST 2012


2012/7/24 mark florisson <markflorisson88 at gmail.com>:
> 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.
>

Yes, in Python here it means C/C++ * unary operator that is called
with cython.operator.dereference()

-- 
vitja.


More information about the cython-devel mailing list