On 2017-09-14 03:55, Steven D'Aprano wrote:
On Wed, Sep 13, 2017 at 11:05:26PM +0200, Jason H wrote:
And look, map() even works with all of them, without inheritance, registration, and whatnot. It's so easy!
Define easy.
Opposite of hard or difficult.
You want to map a function?
map(function, values)
is all it takes. You don't have to care whether the collection of values supports the map() method, or whether the class calls it "apply", or "Map", or something else. All you need care about is that the individual items inside the iterable are valid for the function, but you would need to do that regardless of how you call it.
[1, 2, 3, {}, 5].map(plusone) # will fail
It's far easier for me to do a dir(dict) and see what I can do with it.
And what of the functions that dict doesn't know about?
This is what python does after all. "Does it have the interface I expect?" Global functions like len(), min(), max(), map(), etc(), don't really tell me the full story. len(7) makes no sense. I can attempt to call a function with an invalid argument.
And you can attempt to call a non-existent method:
x = 7 x.len()
Or should that be length() or size() or count() or what?
[].len() makes more sense.
Why? Getting the length of a sequence or iterator is not specifically a list operation, it is a generic operation that can apply to many different kinds of things.
Python is weird in that there are these special magical globals
The word you want is "function".
that operate on many things.
What makes that weird? Even Javascript has functions. So do C, Pascal, Haskell, C++, Lisp, Scheme, and thousands of other languages.
Why is it ','.join(iterable), why isn't there join(',', iterable) At what point does a method become a global? A member? Do we take the path that everything is a global? Or should all methods be members? So far it seems arbitrary.
Okay, its arbitrary.
Why is it called [].len instead of [].length or {}.size? Why None instead of nil or null or nul or NULL or NOTHING?
Many decisions in programming languages are arbitrary.
In Java, strings have .length(), arrays have .length, and collections have .size().