[Python-Dev] PySequence_Check but no __len__

Christian Tismer tismer at stackless.com
Fri Jun 22 07:45:11 EDT 2018


Answering myself:

PySequence_Check determines a sequence. See the docs.

len() can but does not have to exist.
The size is always limited.

After evicting my initial fault, this is now obvious.
Sorry about the noise.


On 22.06.18 13:17, Christian Tismer wrote:
> Hi Brett,
> 
> because you did not understand me, I must have had a fundamental
> misunderstanding. So I started a self-analysis and came to the
> conclusion that this was my error since maybe a decade:
> 
> When iterators and generators came into existence, I somehow
> fell into the trap to think that there are now sequences with
> undetermined or infinite length. They would be exactly those sequences
> which have no __len__ attribute.
> 
> I understand now that sequences are always of fixed length
> and adjusted myself.
> 
> -----------------------------------------
> 
> My problem is to find out how to deal with a class which has
> __getitem__ but no __len__.
> 
> The documentation suggests that the length of a sequence can always
> be obtained by len().
> https://docs.python.org/3/reference/datamodel.html
> 
> But the existence of __len__ is not guaranteed or enforced.
> And if you look at the definition of PySequence_Fast(), you find that
> a sequence can be turned into a list with iteration only and no __len__.
> 
> So, is a sequence valid without __len__, if iteration is supported,
> instead?
> 
> There is the whole chapter about sequence protocol
> https://docs.python.org/3/c-api/sequence.html?highlight=sequence
> 
> but I cannot find out an exact definition what makes up a sequence?
> 
> Sorry if I'm again the only one who misunderstands the obvious :)
> 
> Best -- Chris
> 
> 
> On 21.06.18 18:29, Brett Cannon wrote:
>> Sorry, I don't quite follow.
>>
>> On Thu, 21 Jun 2018 at 08:50 Christian Tismer <tismer at stackless.com
>> <mailto:tismer at stackless.com>> wrote:
>>
>>     Hi friends,
>>
>>     there is a case in the Python API where I am not sure what to do:
>>
>>     If an object defines __getitem__() only but no __len__(),
>>     then PySequence_Check() already is true and does not care.
>>
>>
>> Which matches
>> https://docs.python.org/3/c-api/sequence.html#c.PySequence_Check .
>>
>> From Objects/abstract.c:
>>
>> int
>> PySequence_Check(PyObject *s)
>> {
>>     if (PyDict_Check(s))
>>         return 0;
>>     return s != NULL && s->ob_type->tp_as_sequence &&
>>         s->ob_type->tp_as_sequence->sq_item != NULL;
>> }
>>
>>  
>>
>>
>>     So if I define no __len__, it simply fails. Is this intended?
>>
>>
>> What is "it" in this case that is failing? It isn't PySequence_Check()
>> so I'm not sure what the issue is.
>>
>> -Brett
>>  
>>
>>
>>     I was mislead and thought this was the unlimited case, but
>>     it seems still to be true that sequences are always finite.
>>
>>     Can someone please enlighten me?
>>     -- 
>>     Christian Tismer-Sperling    :^)   tismer at stackless.com
>>     <mailto:tismer at stackless.com>
>>     Software Consulting          :     http://www.stackless.com/
>>     Karl-Liebknecht-Str. 121     :     http://pyside.org
>>     14482 Potsdam                :     GPG key -> 0xE7301150FB7BEE0E
>>     phone +49 173 24 18 776 <tel:+49%20173%202418776>  fax +49 (30)
>>     700143-0023 <tel:+49%2030%207001430023>
>>
>>     _______________________________________________
>>     Python-Dev mailing list
>>     Python-Dev at python.org <mailto:Python-Dev at python.org>
>>     https://mail.python.org/mailman/listinfo/python-dev
>>     Unsubscribe:
>>     https://mail.python.org/mailman/options/python-dev/brett%40python.org
>>
>>
>>
>> _______________________________________________
>> Python-Dev mailing list
>> Python-Dev at python.org
>> https://mail.python.org/mailman/listinfo/python-dev
>> Unsubscribe: https://mail.python.org/mailman/options/python-dev/tismer%40stackless.com
>>
> 
> 
> 
> 
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/tismer%40stackless.com
> 


-- 
Christian Tismer-Sperling    :^)   tismer at stackless.com
Software Consulting          :     http://www.stackless.com/
Karl-Liebknecht-Str. 121     :     http://pyside.org
14482 Potsdam                :     GPG key -> 0xE7301150FB7BEE0E
phone +49 173 24 18 776  fax +49 (30) 700143-0023

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 522 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/python-dev/attachments/20180622/31548c10/attachment.sig>


More information about the Python-Dev mailing list