2012/7/24 mark florisson <markflorisso...@gmail.com>: > On 23 July 2012 20:28, Vitja Makarov <vitja.maka...@gmail.com> wrote: >> 2012/7/23 Vitja Makarov <vitja.maka...@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. _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel