On 22 June 2018 at 21:45, Christian Tismer <tis...@stackless.com> wrote: > Answering myself: > > PySequence_Check determines a sequence. See the docs. > > len() can but does not have to exist. > The size is always limited.
Just to throw a couple of extra wrinkles on this: Due to a C API implementation detail in CPython, not only can len() throw TypeError for non-finite sequences (which implement other parts of the sequence API, but not that), but sufficiently large finite sequences may also throw OverflowError: >>> data = range(-2**64, 2**64) >>> format((data.stop - data.start) // data.step, "e") '3.689349e+19' >>> format(sys.maxsize, "e") '9.223372e+18' >>> len(data) Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: Python int too large to convert to C ssize_t >>> data.__len__() Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: Python int too large to convert to C ssize_t Infinite sequences that want to prevent infinite loops or unbounded memory consumption in consumers may also choose to implement a __length_hint__ that throws TypeError (see https://bugs.python.org/issue33939 for a proposal to do that in itertools). Cheers, Nick. -- Nick Coghlan | ncogh...@gmail.com | Brisbane, Australia _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com