Paul Moore wrote:
> > **How do you check if a container is empty?**
> > IMHO the answer should not depend on the container. While emptiness may 
> > mean different things for different types. The check syntax can and should 
> > still be uniform.
> > I will note that if we take things to extremes, that constraint simply
> cannot be adhered to - types can define bool, len, and any other
> special method we care to invent, however they like. With that in
> mind, I'd argue that if a collection defines bool and len in such a
> way that "not bool(c)" or "len(c) == 0" doesn't mean "c is empty",
> then it is a special case, and has deliberately chosen to be a special
> case.

I can agree that "len(c) == 0" should mean "c is empty" for all practical 
purposes (and numpy and pandas conform with that).

But "bool(c)" should mean "c is empty" is an arbitrary additional constraint. 
For some types (e.g. numpy, padas) that cannot be fulfilled in a logically 
consisent way. By requiring that additional constraint, the Python languages 
forces these containers to be a special case.


To sum things up, I've again written the 

Premise:
It is valuable for the language and ecosystem to not have this special casing. 
I.e. I don't want to write `if not seq` on the one hand and `if len(array) == 
0`. The syntax for checking if a list or an array is empty should be the same.

Conclusion:
If so, PEP-8 has to be changed because "For sequences, (strings, lists, 
tuples), use the fact that empty sequences are false:" is not a universal 
solution.
The question then is, what other syntax to use for an emptiness check.

Possible solutions:
1) The length check is a possible solution:
"For sequences, (strings, lists, tuples), test emptiness by `if len(seq) == 0`.
N.b. I think this is more readable than the variant `if not len(seq)` (but that 
could be discussed as well).

2) The further question is: If we change the PEP 8 recommendation anyway, can 
we do better than the length check?
IMHO a length check is semantically on a lower level than an empty-check. 
Counting elements is a more detailed operation than only checking if we have 
any element. That detail is not needed and distracting if we are only 
interested in is_empty. This is vaguely similar to iterating over indices (`for 
i in range(len(users))`) vs. iterating over elements (`for user in users`). We 
don't iterate over indices because that's usually a detail we don't need. So 
one can argue we shouldn't count elements if we only wan to know if there are 
any.

If we come to the conclusion that an explicit empty check is better than a 
length=0 check, there are again different ways how that could be implmented 
again. My favorite solution now would be adding `is_empty()` methods to all 
standard containers and encourage numpy and pandas to add these methods as 
well. (Alternatively an empty protocol would be a more formal solution to an 
explicit check).
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/FDAOJU7LYZK32VZ53DF4GMWK35NKLGJJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to