Commit c48e26dc authored by INADA Naoki's avatar INADA Naoki Committed by GitHub

bpo-27671: Update FAQ about why len is function (GH-8432)

parent b229b072
...@@ -215,24 +215,25 @@ objects using the ``for`` statement. For example, :term:`file objects ...@@ -215,24 +215,25 @@ objects using the ``for`` statement. For example, :term:`file objects
Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))? Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?
---------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------
The major reason is history. Functions were used for those operations that were As Guido said:
generic for a group of types and which were intended to work even for objects
that didn't have methods at all (e.g. tuples). It is also convenient to have a (a) For some operations, prefix notation just reads better than
function that can readily be applied to an amorphous collection of objects when postfix -- prefix (and infix!) operations have a long tradition in
you use the functional features of Python (``map()``, ``zip()`` et al). mathematics which likes notations where the visuals help the
mathematician thinking about a problem. Compare the easy with which we
In fact, implementing ``len()``, ``max()``, ``min()`` as a built-in function is rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
actually less code than implementing them as methods for each type. One can doing the same thing using a raw OO notation.
quibble about individual cases but it's a part of Python, and it's too late to
make such fundamental changes now. The functions have to remain to avoid massive (b) When I read code that says len(x) I *know* that it is asking for
code breakage. the length of something. This tells me two things: the result is an
integer, and the argument is some kind of container. To the contrary,
.. XXX talk about protocols? when I read x.len(), I have to already know that x is some kind of
container implementing an interface or inheriting from a class that
.. note:: has a standard len(). Witness the confusion we occasionally have when
a class that is not implementing a mapping has a get() or keys()
For string operations, Python has moved from external functions (the method, or something that isn't a file has a write() method.
``string`` module) to methods. However, ``len()`` is still a function.
-- https://mail.python.org/pipermail/python-3000/2006-November/004643.html
Why is join() a string method instead of a list or tuple method? Why is join() a string method instead of a list or tuple method?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment