# mode: run
# tag: forin, builtins, reversed, enumerate
cimport cython
import sys
IS_PY3 = sys.version_info[0] >= 3
IS_32BIT_PY2 = not IS_PY3 and sys.maxint < 2**32
def unlongify(v):
# on 32bit Py2.x platforms, 'unsigned int' coerces to a Python long => fix doctest output here.
s = repr(v)
if IS_32BIT_PY2:
assert s.count('L') == s.count(',') + 1, s
s = s.replace('L', '')
return s
def _reversed(it):
return list(it)[::-1]
@cython.test_assert_path_exists('//ForInStatNode',
'//ForInStatNode/IteratorNode',
'//ForInStatNode/IteratorNode[@reversed = True]',
)
@cython.test_fail_if_path_exists('//ForInStatNode/IteratorNode//SimpleCallNode')
def reversed_list(list l):
"""
>>> [ i for i in _reversed([1,2,3,4]) ]
[4, 3, 2, 1]
>>> reversed_list([1,2,3,4])
[4, 3, 2, 1]
>>> reversed_list([])
[]
>>> reversed_list(None)
Traceback (most recent call last):
TypeError: 'NoneType' object is not iterable
"""
result = []
for item in reversed(l):
result.append(item)
return result
@cython.test_assert_path_exists('//ForInStatNode',
'//ForInStatNode/IteratorNode',
'//ForInStatNode/IteratorNode[@reversed = True]',
)
@cython.test_fail_if_path_exists('//ForInStatNode/IteratorNode//SimpleCallNode')
def reversed_tuple(tuple t):
"""
>>> [ i for i in _reversed((1,2,3,4)) ]
[4, 3, 2, 1]
>>> reversed_tuple((1,2,3,4))
[4, 3, 2, 1]
>>> reversed_tuple(())
[]
>>> reversed_tuple(None)
Traceback (most recent call last):
TypeError: 'NoneType' object is not iterable
"""
result = []
for item in reversed(t):
result.append(item)
return result
@cython.test_assert_path_exists('//ForInStatNode',
'//ForInStatNode/IteratorNode',
'//ForInStatNode/IteratorNode[@reversed = True]',
)
@cython.test_fail_if_path_exists('//ForInStatNode/IteratorNode//SimpleCallNode')
def enumerate_reversed_list(list l):
"""
>>> list(enumerate(_reversed([1,2,3])))
[(0, 3), (1, 2), (2, 1)]
>>> enumerate_reversed_list([1,2,3])
[(0, 3), (1, 2), (2, 1)]
>>> enumerate_reversed_list([])
[]
>>> enumerate_reversed_list(None)
Traceback (most recent call last):
TypeError: 'NoneType' object is not iterable
"""
result = []
cdef Py_ssize_t i
for i, item in enumerate(reversed(l)):
result.append((i, item))
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_range(int N):
"""
>>> [ i for i in _reversed(range(5)) ]
[4, 3, 2, 1, 0]
>>> reversed_range(5)
([4, 3, 2, 1, 0], 0)
>>> [ i for i in _reversed(range(0)) ]
[]
>>> reversed_range(0)
([], 99)
"""
cdef int i = 99
result = []
for i in reversed(range(N)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_range_step_pos(int a, int b):
"""
>>> [ i for i in _reversed(range(0, 5, 1)) ]
[4, 3, 2, 1, 0]
>>> reversed_range_step_pos(0, 5)
([4, 3, 2, 1, 0], 0)
>>> [ i for i in _reversed(range(5, 0, 1)) ]
[]
>>> reversed_range_step_pos(5, 0)
([], 99)
"""
cdef int i = 99
result = []
for i in reversed(range(a, b, 1)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_range_step_neg(int a, int b):
"""
>>> [ i for i in _reversed(range(5, -1, -1)) ]
[0, 1, 2, 3, 4, 5]
>>> reversed_range_step_neg(5, -1)
([0, 1, 2, 3, 4, 5], 5)
>>> [ i for i in _reversed(range(0, 5, -1)) ]
[]
>>> reversed_range_step_neg(0, 5)
([], 99)
"""
cdef int i = 99
result = []
for i in reversed(range(a, b, -1)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_step3(int a, int b):
"""
>>> [ i for i in _reversed(range(-5, 0, 3)) ]
[-2, -5]
>>> reversed_range_step3(-5, 0)
([-2, -5], -5)
>>> [ i for i in _reversed(range(0, 5, 3)) ]
[3, 0]
>>> reversed_range_step3(0, 5)
([3, 0], 0)
>>> [ i for i in _reversed(range(5, 0, 3)) ]
[]
>>> reversed_range_step3(5, 0)
([], 99)
>>> [ i for i in _reversed(range(1, 1, 3)) ]
[]
>>> reversed_range_step3(1, 1)
([], 99)
"""
cdef int i = 99
result = []
for i in reversed(range(a, b, 3)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_step3_expr(int a, int b):
"""
>>> [ i for i in _reversed(range(0, 5, 3)) ]
[3, 0]
>>> reversed_range_step3_expr(0, 5)
([3, 0], 0)
"""
cdef int i = 99, c = 100
result = []
for i in reversed(range(c-c + a + c-c, c-c + b + c-c, 3)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_step3_neg(int a, int b):
"""
>>> [ i for i in _reversed(range(0, -5, -3)) ]
[-3, 0]
>>> reversed_range_step3_neg(0, -5)
([-3, 0], 0)
>>> [ i for i in _reversed(range(5, 0, -3)) ]
[2, 5]
>>> reversed_range_step3_neg(5, 0)
([2, 5], 5)
>>> [ i for i in _reversed(range(0, 5, -3)) ]
[]
>>> reversed_range_step3_neg(0, 5)
([], 99)
>>> [ i for i in _reversed(range(1, 1, -3)) ]
[]
>>> reversed_range_step3_neg(1, 1)
([], 99)
"""
cdef int i = 99
result = []
for i in reversed(range(a, b, -3)):
result.append(i)
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_step3_neg_expr(int a, int b):
"""
>>> [ i for i in _reversed(range(5, 0, -3)) ]
[2, 5]
>>> reversed_range_step3_neg_expr(5, 0)
([2, 5], 5)
"""
cdef int i = 99, c = 100
result = []
for i in reversed(range(c-c + a + c-c, c-c + b + c-c, -3)):
result.append(i)
return result, i
def reversed_range_step3_py_args(a, b):
"""
>>> [ i for i in _reversed(range(-5, 0, 3)) ]
[-2, -5]
>>> reversed_range_step3_py_args(-5, 0)
([-2, -5], -5)
>>> [ i for i in _reversed(range(0, 5, 3)) ]
[3, 0]
>>> reversed_range_step3_py_args(0, 5)
([3, 0], 0)
>>> [ i for i in _reversed(range(5, 0, 3)) ]
[]
>>> reversed_range_step3_py_args(5, 0)
([], 99)
>>> [ i for i in _reversed(range(1, 1, 3)) ]
[]
>>> reversed_range_step3_py_args(1, 1)
([], 99)
>>> reversed_range_step3_py_args(set(), 1) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...integer...
>>> reversed_range_step3_py_args(1, set()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...integer...
"""
i = 99
result = []
for i in reversed(range(a, b, 3)):
result.append(i)
return result, i
def reversed_range_step3_neg_py_args(a, b):
"""
>>> [ i for i in _reversed(range(0, -5, -3)) ]
[-3, 0]
>>> reversed_range_step3_neg_py_args(0, -5)
([-3, 0], 0)
>>> [ i for i in _reversed(range(5, 0, -3)) ]
[2, 5]
>>> reversed_range_step3_neg_py_args(5, 0)
([2, 5], 5)
>>> [ i for i in _reversed(range(0, 5, -3)) ]
[]
>>> reversed_range_step3_neg_py_args(0, 5)
([], 99)
>>> [ i for i in _reversed(range(1, 1, -3)) ]
[]
>>> reversed_range_step3_neg_py_args(1, 1)
([], 99)
>>> reversed_range_step3_neg_py_args(set(), 1) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...integer...
>>> reversed_range_step3_neg_py_args(1, set()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...integer...
"""
i = 99
result = []
for i in reversed(range(a, b, -3)):
result.append(i)
return result, i
def reversed_range_step3_py_obj_left(a, int b):
"""
>>> reversed_range_step3_py_obj_left(set(), 0) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...int...
"""
cdef long i
result = []
for i in reversed(range(a, b, 3)):
result.append(i)
def reversed_range_step3_py_obj_right(int a, b):
"""
>>> reversed_range_step3_py_obj_right(0, set()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...int...
"""
cdef long i
result = []
for i in reversed(range(a, b, 3)):
result.append(i)
def reversed_range_step3_neg_py_obj_left(a, int b):
"""
>>> reversed_range_step3_neg_py_obj_left(set(), 0) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...int...
"""
cdef long i
result = []
for i in reversed(range(a, b, -3)):
result.append(i)
def reversed_range_step3_neg_py_obj_right(int a, b):
"""
>>> reversed_range_step3_py_obj_right(0, set()) # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: ...int...
"""
cdef long i
result = []
for i in reversed(range(a, b, -3)):
result.append(i)
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_constant():
"""
>>> [ i for i in _reversed(range(-12, -2, 4)) ]
[-4, -8, -12]
>>> reversed_range_constant()
([-4, -8, -12], -12)
"""
cdef int i = 99
result = []
for i in reversed(range(1, 1, 4)):
result.append(i)
assert result == list(reversed(range(1, 1, 4))), result
assert i == 99
for i in reversed(range(1, 1, 1)):
result.append(i)
assert result == list(reversed(range(1, 1, 1))), result
result = []
for i in reversed(range(0, 1, 4)):
result.append(i)
assert result == list(reversed(range(0, 1, 4))), result
result = []
for i in reversed(range(0, 1, 1)):
result.append(i)
assert result == list(reversed(range(0, 1, 1))), result
result = []
for i in reversed(range(1, 8, 4)):
result.append(i)
assert result == list(reversed(range(1, 8, 4))), result
result = []
for i in reversed(range(1, 8, 1)):
result.append(i)
assert result == list(reversed(range(1, 8, 1))), result
result = []
for i in reversed(range(1, 9, 4)):
result.append(i)
assert result == list(reversed(range(1, 9, 4))), result
result = []
for i in reversed(range(1, 10, 4)):
result.append(i)
assert result == list(reversed(range(1, 10, 4))), result
result = []
for i in reversed(range(1, 11, 4)):
result.append(i)
assert result == list(reversed(range(1, 11, 4))), result
result = []
for i in reversed(range(1, 12, 4)):
result.append(i)
assert result == list(reversed(range(1, 12, 4))), result
result = []
for i in reversed(range(0, 8, 4)):
result.append(i)
assert result == list(reversed(range(0, 8, 4))), result
result = []
for i in reversed(range(0, 9, 4)):
result.append(i)
assert result == list(reversed(range(0, 9, 4))), result
result = []
for i in reversed(range(0, 10, 4)):
result.append(i)
assert result == list(reversed(range(0, 10, 4))), result
result = []
for i in reversed(range(0, 11, 4)):
result.append(i)
assert result == list(reversed(range(0, 11, 4))), result
result = []
for i in reversed(range(0, 12, 4)):
result.append(i)
assert result == list(reversed(range(0, 12, 4))), result
i = 99
result = []
for i in reversed(range(-12, -2, 4)):
result.append(i)
assert result == list(reversed(range(-12, -2, 4))), result
return result, i
@cython.test_assert_path_exists('//ForFromStatNode')
@cython.test_fail_if_path_exists('//ForInStatNode')
def reversed_range_constant_neg():
"""
>>> [ i for i in _reversed(range(-2, -12, -4)) ]
[-10, -6, -2]
>>> reversed_range_constant_neg()
"""
cdef int i = 99
result = []
for i in reversed(range(1, 1, -4)):
result.append(i)
assert result == list(reversed(range(1, 1, -4))), result
assert i == 99
result = []
for i in reversed(range(1, 1, -1)):
result.append(i)
assert result == list(reversed(range(1, 1, -1))), result
result = []
for i in reversed(range(1, 0, -4)):
result.append(i)
assert result == list(reversed(range(1, 0, -4))), result
result = []
for i in reversed(range(1, 0, -1)):
result.append(i)
assert result == list(reversed(range(1, 0, -1))), result
result = []
for i in reversed(range(8, 1, -4)):
result.append(i)
assert result == list(reversed(range(8, 1, -4))), result
result = []
for i in reversed(range(8, 1, -1)):
result.append(i)
assert result == list(reversed(range(8, 1, -1))), result
result = []
for i in reversed(range(9, 1, -4)):
result.append(i)
assert result == list(reversed(range(9, 1, -4))), result
result = []
for i in reversed(range(9, 1, -1)):
result.append(i)
assert result == list(reversed(range(9, 1, -1))), result
result = []
for i in reversed(range(10, 1, -4)):
result.append(i)
assert result == list(reversed(range(10, 1, -4))), result
result = []
for i in reversed(range(11, 1, -4)):
result.append(i)
assert result == list(reversed(range(11, 1, -4))), result
result = []
for i in reversed(range(11, 1, -1)):
result.append(i)
assert result == list(reversed(range(11, 1, -1))), result
result = []
for i in reversed(range(12, 1, -4)):
result.append(i)
assert result == list(reversed(range(12, 1, -4))), result
result = []
for i in reversed(range(12, 1, -1)):
result.append(i)
assert result == list(reversed(range(12, 1, -1))), result
result = []
for i in reversed(range(8, 0, -4)):
result.append(i)
assert result == list(reversed(range(8, 0, -4))), result
result = []
for i in reversed(range(8, 0, -1)):
result.append(i)
assert result == list(reversed(range(8, 0, -1))), result
result = []
for i in reversed(range(9, 0, -4)):
result.append(i)
assert result == list(reversed(range(9, 0, -4))), result
result = []
for i in reversed(range(9, 0, -1)):
result.append(i)
assert result == list(reversed(range(9, 0, -1))), result
result = []
for i in reversed(range(10, 0, -4)):
result.append(i)
assert result == list(reversed(range(10, 0, -4))), result
result = []
for i in reversed(range(10, 0, -1)):
result.append(i)
assert result == list(reversed(range(10, 0, -1))), result
result = []
for i in reversed(range(11, 0, -4)):
result.append(i)
assert result == list(reversed(range(11, 0, -4))), result
result = []
for i in reversed(range(11, 0, -1)):
result.append(i)
assert result == list(reversed(range(11, 0, -1))), result
result = []
for i in reversed(range(12, 0, -4)):
result.append(i)
assert result == list(reversed(range(12, 0, -4))), result
result = []
for i in reversed(range(12, 0, -1)):
result.append(i)
assert result == list(reversed(range(12, 0, -1))), result
result = []
for i in reversed(range(-2, -12, -4)):
result.append(i)
assert result == list(reversed(range(-2, -12, -4))), result
result = []
for i in reversed(range(-2, -12, -1)):
result.append(i)
assert result == list(reversed(range(-2, -12, -1))), result
unicode_string = u"abcDEF"
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode(unicode u):
"""
>>> print(''.join(_reversed(unicode_string)))
FEDcba
>>> print(''.join(reversed_unicode(unicode_string)))
FEDcba
"""
result = []
for c in reversed(u):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[1:-2])))
Dcb
>>> print(''.join(reversed_unicode_slice(unicode_string)))
Dcb
"""
result = []
for c in reversed(u[1:-2]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_neg_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[-2:1:-1])))
cDE
>>> print(''.join(reversed_unicode_slice_neg_step(unicode_string)))
cDE
"""
result = []
for c in reversed(u[-2:1:-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_pos_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[1:-2:1])))
Dcb
>>> print(''.join(reversed_unicode_slice_pos_step(unicode_string)))
Dcb
"""
result = []
for c in reversed(u[1:-2:1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_start_pos_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[2::1])))
FEDc
>>> print(''.join(reversed_unicode_slice_start_pos_step(unicode_string)))
FEDc
"""
result = []
for c in reversed(u[2::1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_start_neg_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[3::-1])))
abcD
>>> print(''.join(reversed_unicode_slice_start_neg_step(unicode_string)))
abcD
"""
result = []
for c in reversed(u[3::-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_end_pos_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[:-2:1])))
Dcba
>>> print(''.join(reversed_unicode_slice_end_pos_step(unicode_string)))
Dcba
"""
result = []
for c in reversed(u[:-2:1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_end_neg_step(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[:-3:-1])))
EF
>>> print(''.join(reversed_unicode_slice_end_neg_step(unicode_string)))
EF
"""
result = []
for c in reversed(u[:-3:-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_neg_step_only(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[::-1])))
abcDEF
>>> print(''.join(reversed_unicode_slice_neg_step_only(unicode_string)))
abcDEF
"""
result = []
for c in reversed(u[::-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unicode_slice_pos_step_only(unicode u):
"""
>>> print(''.join(_reversed(unicode_string[::1])))
FEDcba
>>> print(''.join(reversed_unicode_slice_pos_step_only(unicode_string)))
FEDcba
"""
result = []
for c in reversed(u[::1]):
result.append(c)
return result
bytes_string = b'abcDEF'
join_bytes = b''.join
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_bytes(bytes s):
"""
>>> b = IS_PY3 and bytes_string or map(ord, bytes_string)
>>> list(_reversed(b))
[70, 69, 68, 99, 98, 97]
>>> reversed_bytes(bytes_string)
[70, 69, 68, 99, 98, 97]
"""
cdef char c
result = []
for c in reversed(s):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_bytes_slice(bytes s):
"""
>>> b = IS_PY3 and bytes_string or map(ord, bytes_string)
>>> list(_reversed(b[1:-2]))
[68, 99, 98]
>>> reversed_bytes_slice(bytes_string)
[68, 99, 98]
"""
cdef char c
result = []
for c in reversed(s[1:-2]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_bytes_slice_step(bytes s):
"""
>>> b = IS_PY3 and bytes_string or map(ord, bytes_string)
>>> list(_reversed(b[-2:1:-1]))
[99, 68, 69]
>>> reversed_bytes_slice_step(bytes_string)
[99, 68, 69]
"""
cdef char c
result = []
for c in reversed(s[-2:1:-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_bytes_slice_step_only(bytes s):
"""
>>> b = IS_PY3 and bytes_string or map(ord, bytes_string)
>>> list(_reversed(b[::-1]))
[97, 98, 99, 68, 69, 70]
>>> reversed_bytes_slice_step_only(bytes_string)
[97, 98, 99, 68, 69, 70]
"""
cdef char c
result = []
for c in reversed(s[::-1]):
result.append(c)
return result
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unsigned(int a, int b):
"""
>>> unlongify(reversed_unsigned(0, 5))
'[4, 3, 2, 1, 0]'
>>> unlongify(reversed_unsigned(1, 5))
'[4, 3, 2, 1]'
>>> reversed_unsigned(1, 1)
[]
"""
cdef unsigned int i
return [i for i in reversed(range(a, b))]
@cython.test_assert_path_exists('//ForFromStatNode')
def reversed_unsigned_by_3(int a, int b):
"""
>>> unlongify(reversed_unsigned_by_3(0, 5))
'[3, 0]'
>>> unlongify(reversed_unsigned_by_3(0, 7))
'[6, 3, 0]'
"""
cdef unsigned int i
return [i for i in reversed(range(a, b, 3))]
@cython.test_assert_path_exists('//ForFromStatNode')
def range_unsigned_by_neg_3(int a, int b):
"""
>>> unlongify(range_unsigned_by_neg_3(-1, 6))
'[6, 3, 0]'
>>> unlongify(range_unsigned_by_neg_3(0, 7))
'[7, 4, 1]'
"""
cdef unsigned int i
return [i for i in range(b, a, -3)]