bpo-27671: Update FAQ about why len is function (GH-8432) · python/cpython@c48e26d (original) (raw)

``` @@ -215,24 +215,25 @@ objects using the for statement. For example, :term:`file objects


`215`

`215`

`Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?

`

`216`

`216`

`----------------------------------------------------------------------------------------------------------------

`

`217`

`217`

``

`218`

``

`-

The major reason is history. Functions were used for those operations that were

`

`219`

``

`-

generic for a group of types and which were intended to work even for objects

`

`220`

``

`-

that didn't have methods at all (e.g. tuples). It is also convenient to have a

`

`221`

``

`-

function that can readily be applied to an amorphous collection of objects when

`

`222`

``

``` -

you use the functional features of Python (``map()``, ``zip()`` et al).

223

``

-

224

``


In fact, implementing ``len()``, ``max()``, ``min()`` as a built-in function is

225

``

`-

actually less code than implementing them as methods for each type. One can

`

226

``

`-

quibble about individual cases but it's a part of Python, and it's too late to

`

227

``

`-

make such fundamental changes now. The functions have to remain to avoid massive

`

228

``

`-

code breakage.

`

229

``

-

230

``

`-

.. XXX talk about protocols?

`

231

``

-

232

``

`-

.. note::

`

233

``

-

234

``

`-

For string operations, Python has moved from external functions (the

`

235

``


 ``string`` module) to methods. However, ``len()`` is still a function.

``

218

`+

As Guido said:

`

``

219

+

``

220

`+

(a) For some operations, prefix notation just reads better than

`

``

221

`+

postfix -- prefix (and infix!) operations have a long tradition in

`

``

222

`+

mathematics which likes notations where the visuals help the

`

``

223

`+

mathematician thinking about a problem. Compare the easy with which we

`

``

224

`+

rewrite a formula like x*(a+b) into xa + xb to the clumsiness of

`

``

225

`+

doing the same thing using a raw OO notation.

`

``

226

+

``

227

`+

(b) When I read code that says len(x) I know that it is asking for

`

``

228

`+

the length of something. This tells me two things: the result is an

`

``

229

`+

integer, and the argument is some kind of container. To the contrary,

`

``

230

`+

when I read x.len(), I have to already know that x is some kind of

`

``

231

`+

container implementing an interface or inheriting from a class that

`

``

232

`+

has a standard len(). Witness the confusion we occasionally have when

`

``

233

`+

a class that is not implementing a mapping has a get() or keys()

`

``

234

`+

method, or something that isn't a file has a write() method.

`

``

235

+

``

236

`+

-- https://mail.python.org/pipermail/python-3000/2006-November/004643.html

`

236

237

``

237

238

``

238

239

`Why is join() a string method instead of a list or tuple method?

`