What is not objects in Python?

bearophileHUGS at lycos.com bearophileHUGS at lycos.com
Sun Sep 28 16:06:29 EDT 2008


Terry Reedy:
> Partly history and partly practicality.  Len is implemented as .__len__
> ;-).  The len function is one, __len__ methods are many.  If you want to
> pass an argument to a function, passing len is easier that passing
> operator.attrgetter('__len__').  Passing '__len__' (or 'len') would be
> easy, but using len is easier than using getattr(ob,'__len__').

A simple example may help:

>>> seq = ["aaaa", "bb", "c", "ddd"]
>>> seq2 = [[1,1,1,1], [2,2], [3], [4,4,4]]
>>> sorted(seq, key=len)
['c', 'bb', 'ddd', 'aaaa']
>>> sorted(seq2, key=len)
[[3], [2, 2], [4, 4, 4], [1, 1, 1, 1]]
>>> sorted(seq, key=str.__len__)
['c', 'bb', 'ddd', 'aaaa']
>>> sorted(seq2, key=str.__len__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor '__len__' requires a 'str' object but received a
'list'
>>> from operator import attrgetter
>>> sorted(seq, key=attrgetter("__len__"))
['aaaa', 'bb', 'c', 'ddd']
>>> sorted(seq2, key=attrgetter("__len__"))
[[1, 1, 1, 1], [2, 2], [3], [4, 4, 4]]

Bye,
bearophile



More information about the Python-list mailing list