On Thu, 24 Aug 2017 06:21 pm, Paul Rubin wrote: > Peter Otten <__pete...@web.de> writes: >> Python 3 where the next() method has been renamed to __next__(). > > Oh cripes, you're right, it never occurred to me that py3 had broken > .next(). I thought it was called .next() instead of .__next() > so that it wouldn't be a dunder method.
Not so much *broken* it as *fixed* it :-) Guido decided years ago that directly exposing next as a public method was a mistake. Instead, like len(), str(), repr(), iter() etc. the public API is to call the next() built-in function, and the implementation is the __next__ dunder. I don't remember whether that decision was just for consistency with other special methods, or whether there was some other deeper reason... Possibly so it was easy to add a default value to next() without having to force every iterator class to re-implement the same default behaviour? That seems reasonable... in Python 2.7, the next method takes no default argument: py> iter("").next(99) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: expected 0 arguments, got 1 but the built-in function does: py> next(iter(""), 99) 99 In general, the public API function (whether built-in like next, or not) can do much more than just call the dunder method, e.g. look at the various operators. -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list