Re: [Python-Dev] PySequence_Check but no __len__

2018年6月22日 04:20:46 -0700

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 2018年6月21日 at 08:50 Christian Tismer <[email protected]
> <mailto:[email protected]>> 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  :^)  [email protected]
> <mailto:[email protected]>
> 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
> [email protected] <mailto:[email protected]>
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:
> https://mail.python.org/mailman/options/python-dev/brett%40python.org
> 
> 
> 
> _______________________________________________
> Python-Dev mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: 
> https://mail.python.org/mailman/options/python-dev/tismer%40stackless.com
> 
-- 
Christian Tismer-Sperling :^) [email protected]
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

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to