[Python-Dev] Clean way in python to test for None, empty, scalar, and list/ndarray? A prayer to the gods of Python
Robert Kern
robert.kern at gmail.com
Sat Jun 15 00:31:47 CEST 2013
On 2013-06-14 21:55, R. David Murray wrote:
> On Fri, 14 Jun 2013 21:12:00 +0200, Martin Schultz <maschu09 at gmail.com> wrote:
>> 2. Testing for empty lists or empty ndarrays:
>>
>> In principle, `len(x) == 0` will do the trick. **BUT** there are several
>> caveats here:
>> - `len(scalar)` raises a TypeError, so you will have to use try and
>> except or find some other way of testing for a scalar value
>> - `len(numpy.array(0))` (i.e. a scalar coded as numpy array) also raises
>> a TypeError ("unsized object")
>> - `len([[]])` returns a length of 1, which is somehow understandable,
>> but - I would argue - perhaps not what one might expect initially
>>
>> Alternatively, numpy arrays have a size attribute, and
>> `numpy.array([]).size`, `numpy.array(8.).size`, and
>> `numpy.array([8.]).size` all return what you would expect. And even
>> `numpy.array([[]]).size` gives you 0. Now, if I could convert everything to
>> a numpy array, this might work. But have you ever tried to assign a list of
>> mixed data types to a numpy array? `numpy.array(["a",1,[2,3],(888,9)])`
>> will fail, even though the list inside is perfectly fine as a list.
>
> In general you test whether nor not something is empty in Python by
> testing its truth value. Empty things are False. Numpy seems to
> follow this using size, from the limited examples you have given
>
> >>> bool(numpy.array([[]])
> False
> >>> bool(numpy.array([[1]])
> True
numpy does not do so. Empty arrays are extremely rare and testing for them rarer
(rarer still is testing for emptiness not knowing if it is an array or some
other sequence). What people usually want from bool(some_array) is either
some_array.all() or some_array.any(). In the face of this ambiguity, numpy
refuses the temptation to guess and raises an exception explaining matters.
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the Python-Dev
mailing list