5 ms·
If you have __len__() implemented on the object, why not call it directly? If you are dealing with object X, that is of classes A,B,C or D (that all implement _
by silversmith 16y ago
If you have __len__() implemented on the object, why not call it directly? If you are dealing with object X, that is of classes A,B,C or D (that all implement __len__), I don't see the fundamental difference between len(X) and X.__len__().
- etal 16y agoThe "magic methods" wrapped in in double-underscores are special because other parts of the language's syntax rely on them always meaning the same thing. (Some room for programmer misbehavior here.) Example: If __len__ is defined on an object x, and __nonzero__ (Py2) or __bool__ (Py3) is not defined, then "not x" will test if x.__len__() == 0. Similarly, __contains__ interacts with "foo in x", and __eq__ and __hash__ are expected to play well together for hashable objects (e.g. unique members of a set). The double underscores are a useful code smell that indicates you're changing how an object interacts with Python's syntax.
- avibryant 16y agoI've been puzzled by len() and company for a long time and this is the most complete and sensible explanation I've heard. Thank you. I still think it's the wrong design, mind you, but I no longer think it's a crazy one.
- megaman821 16y agoThere really is no difference except that len() will raise an error if no __len__ method is found on the object.
- j_baker 16y agoTomato, tomahto. Why use x.__len__() rather than len(x)?