Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do tuples in Python work with reversed but do not have __reversed__?

In discussion of this answer we realized that tuples do not have a __reversed__ method. My guess was that creating the iterator would require mutating the tuple. And yet tuples play fine with reversed. Why can't the approach used for reversed be made to work for __reversed__ as well?

>>> foo = range(3)
>>> foo
[0, 1, 2]
>>> list(foo.__reversed__())
[2, 1, 0]
>>> foo
[0, 1, 2]
>>> bar = (0, 1, 2)
>>> list(bar.__reversed__())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__reversed__'
>>> reversed(bar)
<reversed object at 0x10603b310>
>>> tuple(reversed(bar))
(2, 1, 0)
like image 481
kuzzooroo Avatar asked Mar 19 '23 01:03

kuzzooroo


1 Answers

According to the spec:

reversed(seq)

Return a reverse iterator. seq must be an object which has a reversed() method or supports the sequence protocol (the __len__() method and the __getitem__() method with integer arguments starting at 0).

like image 177
Nir Alfasi Avatar answered Apr 18 '23 13:04

Nir Alfasi