“Container” is a kind of pun, it’s something with a __contains__ method.
The thing you’re looking for is “Collection”, which is the base for
sequences, mappings and sets.

I also note that the discussion seems quite stuck.

—Guido

On Tue, Aug 24, 2021 at 21:55 Christopher Barker <python...@gmail.com>
wrote:

> It seems the conversation has confused two related concepts:
>
> 1) The default bool() implementation (Truthiness) -- this is what the OP
> said was recommended by PEP 8: "For sequences, (strings, lists, tuples),
> use the fact that empty sequences are false:" -- there is some debate about
> that whether this is a good recommendation or not, but i don't think that's
> the OPs point. Rather:
>
> 2) That there is no standard way to explicitly test containers for
> "emptiness" - - there is only length, with the assumption that
> len(something) == 0 or not len(something) is a good way to test for
> emptiness.
>
> I still don't see why length is not perfectly adequate, but i wonder if
> there are any  "containers" i.e.things that could be empty, in the std lib
> that don't support length.
>
> Looking in the ABCs, a Container is something that supports `in`, and a
> Sized is something that supports len()-- so in theory, there could be a
> Container that does not have a length. Are there any in the std lib?
>
> Perhaps the ABCs are instructive in another way here -- if we were to add
> a __empty__ or some such dunder, what ABC would require it? Container? or
> yet another one-method ABC?
>
> -CHB
>
>
> On Tue, Aug 24, 2021 at 8:39 PM David Mertz, Ph.D. <david.me...@gmail.com>
> wrote:
>
>> I wanted to do a survey of various "aggregates" in Python to see if any
>> stand out as making the usual `if stuff: ...` troublesome.  I wrote a
>> little script at
>> https://github.com/DavidMertz/LanguagePractice/blob/main/python/aggregates.py
>> .
>>
>> I'm being deliberately vague about an "aggregate."  It might not be a
>> collection strictly speaking, but it is something that might seems to
>> "contain" values in some sense.  Basically, I think that standard library
>> and built-in stuff behaves per PEP8.  Some other libraries go their own
>> way.  I throw in a linked-list implementation I found on PyPI.  I've never
>> used it beyond this script; but per what it is, it cannot implement `len()`
>> on O(1) (well, it *could* if it does extra bookkeeping; but then it's kinda
>> a different thing).
>>
>> In NumPy land, the np.empty vs. np.zeros case is another oddball.  On my
>> system, my memory happened to have some prior value that wasn't zero; that
>> could vary between runs, in principle.
>>
>> These are the results:
>>
>> Expr: '' | Value: ''
>>   Truth: False | Length: 0
>> Expr: list() | Value: []
>>   Truth: False | Length: 0
>> Expr: tuple() | Value: ()
>>   Truth: False | Length: 0
>> Expr: dict() | Value: {}
>>   Truth: False | Length: 0
>> Expr: set() | Value: set()
>>   Truth: False | Length: 0
>> Expr: bytearray() | Value: bytearray(b'')
>>   Truth: False | Length: 0
>> Expr: bytearray(1) | Value: bytearray(b'\x00')
>>   Truth: True | Length: 1
>> Expr: bytearray([0]) | Value: bytearray(b'\x00')
>>   Truth: True | Length: 1
>> Expr: array.array('i') | Value: array('i')
>>   Truth: False | Length: 0
>> Expr: array.array('i', []) | Value: array('i')
>>   Truth: False | Length: 0
>> Expr: Nothing() | Value: EmptyNamedTuple()
>>   Truth: False | Length: 0
>> Expr: deque() | Value: deque([])
>>   Truth: False | Length: 0
>> Expr: deque([]) | Value: deque([])
>>   Truth: False | Length: 0
>> Expr: ChainMap() | Value: ChainMap({})
>>   Truth: False | Length: 0
>> Expr: queue.Queue() | Value: <queue.Queue object at 0x7f0940dd2190>
>>   Truth: True | Length: No length
>> Expr: asyncio.Queue() | Value: <Queue at 0x7f0940dd2190 maxsize=0>
>>   Truth: True | Length: No length
>> Expr: multiprocessing.Queue() | Value: <multiprocessing.queues.Queue
>> object at 0x7f0940dd2190>
>>   Truth: True | Length: No length
>> Expr: np.ndarray(1,) | Value: array([5.e-324])
>>   Truth: True | Length: 1
>> Expr: np.ndarray((1,0)) | Value: array([], shape=(1, 0), dtype=float64)
>>   Truth: False | Length: 1
>> Expr: np.empty((1,)) | Value: array([5.e-324])
>>   Truth: True | Length: 1
>> Expr: np.zeros((1,)) | Value: array([0.])
>>   Truth: False | Length: 1
>> Expr: np.zeros((2,)) | Value: array([0., 0.])
>>   Truth: No Truthiness | Length: 2
>> Expr: np.ones((1,)) | Value: array([1.])
>>   Truth: True | Length: 1
>> Expr: np.ones((2,)) | Value: array([1., 1.])
>>   Truth: No Truthiness | Length: 2
>> Expr: pd.Series() | Value: Series([], dtype: float64)
>>   Truth: No Truthiness | Length: 0
>> Expr: pd.DataFrame() | Value: Empty DataFrame
>>   Truth: No Truthiness | Length: 0
>> Expr: xr.DataArray() | Value: <xarray.DataArray ()>
>>   Truth: True | Length: No length
>> Expr: linkedadt.LinkedList() | Value: <linkedadt.LinkedList object at
>> 0x7f08d8d77f40>
>>   Truth: False | Length: 0
>>
>>
>>
>> --
>> Keeping medicines from the bloodstreams of the sick; food
>> from the bellies of the hungry; books from the hands of the
>> uneducated; technology from the underdeveloped; and putting
>> advocates of freedom in prisons.  Intellectual property is
>> to the 21st century what the slave trade was to the 16th.
>> _______________________________________________
>> 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/XIQPNWDNRDGO3NOIY5KUHZ5CMR67TRWS/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
>
> --
> Christopher Barker, PhD (Chris)
>
> Python Language Consulting
>   - Teaching
>   - Scientific Software Development
>   - Desktop GUI and Web Development
>   - wxPython, numpy, scipy, Cython
> _______________________________________________
> 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/6QF7NPIB2ZODZWAR7VKVZJHSKADTORNG/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-- 
--Guido (mobile)
_______________________________________________
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/PA4ZNP6CZNAVI7YDVCACDBUBUUW2PFKH/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to