Hacker News new | ask | show | jobs
by reuser 5233 days ago
People writing tools to learn, or because the existing ones didn't suit their needs or tastes, occurs in every language and is very different from Perl-style "more than one way to do it".

It's ridiculous to act like the mere existence of multiple independent projects for one task is some kind of searing indictment of the "one obvious way" principle in language and API design.

1 comments

I've never actually noticed "one obvious way". There are a couple ways to do almost everything in Python; loops or map, Twisted or threads, unittest2 or nose, and so on. I like Python, but human nature pushes everything towards "there are many ways to do it", and humans have influenced the direction of Python.

I prefer Perl's approach of embracing more than one way to do things. I don't really want there to be 8 ways to do one thing, but it's just a more realistic outlook. You go into Perl knowing that you are going to have to try a bunch of different things to see what fits your mental model, instead of being told what to do. (I used Python at a Bank where they wrote their own style guide, completely different from the standard Python style guide. WTF? Humans have a way of ruining everything.)

Ironically, many things in Perl have converged into "One Obvious Way"; PSGI/Plack for web frameworks, Test::Builder for unit tests, and so on.

> There are a couple ways to do almost everything in Python; loops or map, Twisted or threads, unittest2 or nose, and so on

There are always more than 1 ways to do something, but Python tries to be directive towards the recommended way for the core.

For the given snippet, using reduce for loops is frowned upon; nothing is stopping you from doing it, but the general opinion is you shouldn't do it. I think that counts as there being an obvious way.

    def pipe(val, fns):
        return reduce(lambda val, fn: fn(val), fns, val)

    def pipe2(val, fns):
        for fn in fns:
            val = fn(val)
        return val

    fns = [lambda x: x + 1, lambda x: x * x]
    print pipe(5, fns)

    print pipe2(5, fns)
As far as maps and list comprehension go, that isn't clear-cut but people incline towards comprehensions.

<nitpick> Twisted(reactors) and threads implement two different things which serve different purposes, and unittest2 is a lib while nose is a test runner. </nitpick>

That said, there is always going to be many ways to do something, but it helps if the core tries to stick with a uniform way to do things.