Feishi - 9 days ago 6

Python Question

I'm learning numpy. But I got some questions confused me:

`>>> import numpy as np`

>>> a = np.arange(10)

>>> a.sum()

45

and:

`sum(a)`

So why a built-in function can support the calculation of a data type from a third-party library? min() and max() do the same.(When the dim is 1)

I got two guesses about this, I prefer the latter:

- python core developer add the support for ndarray;
- some hidden attributes define in ndarray make that happen.(If so, what is it?)

Answer

All a third-party library type has to do, is implement the expected *protocol* (sometimes also called an *interface*). The `sum()`

function documentation tells you what is expected:

Sums

startand the items of anfrom left to right and returns the total.iterable

`min()`

and `max()`

state similar requirements (*Return the smallest item in an iterable*, *Return the largest item in an iterable*).

Here, *iterable* is a protocol, described in the standard types documentation. Protocols are not themselves types, they are just a collection of methods that are expected to behave in a certain way. The `collections.abc`

module provides several objects you can use to test if something implements a protocol:

```
>>> import numpy as np
>>> from collections.abc import Iterable
>>> a = np.arange(10)
>>> isinstance(a, Iterable)
True
```

So the `ndarray`

type is an iterable, and that's what the `sum()`

function uses to get all the values contained in the array, summing those values for you.

Because Python relies on protocols, the core language developers don't have to add support for every third-party library out there. Instead, the libraries simply match the expectations of the core language.

Note that the `ndarray.sum()`

implementation can make use of the internal implementation of the type; it probably can produce the sum faster, as it doesn't have to convert the internal data to Python objects first (iteration returns *boxed types*, Python `int`

objects in this case, while the internal representation contains bare C integers).