[Python-checkins] bpo-27671: Update FAQ about why len is function (GH-8432)

Miss Islington (bot) webhook-mailer at python.org
Tue Jul 31 01:56:30 EDT 2018


https://github.com/python/cpython/commit/0b376eb0d63e0c51ed55c620b40edae6ded4ea48
commit: 0b376eb0d63e0c51ed55c620b40edae6ded4ea48
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-07-30T22:56:27-07:00
summary:

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

(cherry picked from commit c48e26dcadbff8620bb5881d3bd148fc8894d0ef)

Co-authored-by: INADA Naoki <methane at users.noreply.github.com>

files:
M Doc/faq/design.rst

diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst
index bb20f04c5554..234dc9c12b5e 100644
--- a/Doc/faq/design.rst
+++ b/Doc/faq/design.rst
@@ -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))?
 ----------------------------------------------------------------------------------------------------------------
 
-The major reason is history. Functions were used for those operations that were
-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
-function that can readily be applied to an amorphous collection of objects when
-you use the functional features of Python (``map()``, ``zip()`` et al).
-
-In fact, implementing ``len()``, ``max()``, ``min()`` as a built-in function is
-actually less code than implementing them as methods for each type.  One can
-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
-code breakage.
-
-.. XXX talk about protocols?
-
-.. note::
-
-   For string operations, Python has moved from external functions (the
-   ``string`` module) to methods.  However, ``len()`` is still a function.
+As Guido said:
+
+    (a) For some operations, prefix notation just reads better than
+    postfix -- prefix (and infix!) operations have a long tradition in
+    mathematics which likes notations where the visuals help the
+    mathematician thinking about a problem. Compare the easy with which we
+    rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
+    doing the same thing using a raw OO notation.
+
+    (b) When I read code that says len(x) I *know* that it is asking for
+    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,
+    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
+    has a standard len(). Witness the confusion we occasionally have when
+    a class that is not implementing a mapping has a get() or keys()
+    method, or something that isn't a file has a write() method.
+
+    -- https://mail.python.org/pipermail/python-3000/2006-November/004643.html
 
 
 Why is join() a string method instead of a list or tuple method?



More information about the Python-checkins mailing list