And if that isn't enough, the answer is OCaml, F#, D, C#, Java, Scala, Haskell, Kotlin, C++,... definitely not going from horse to donkey in language features.
I disagree that Go's insistence on verbosity improves readability. Each individual line may simpler, but the larger purpose of the code is obscured in all the "if err != nil" weeds.
My unpopular opinion is that Dart should get a lot more attention. Strong typing with null-safety, compiles to native, batteries included, and nearly as expressive as Python.
That's the difference between script and system programming. When writing scripts, one is only concerned about carrying out a certain task and if anything goes wrong the whole thing can bail. Systems are more robust. When things go wrong they cannot just fail. They need to recover gracefully and do something meaningful in the failed state.
Handing failure conditions is the primary purpose of system code. Irrespective of Go, there is something to be said about some kind of identifier that says "take note: this is the most important code in the application!" If that comes across as being 'weedy', you know that you really needed a scripting language, not a systems language.
Different tools for different jobs.
Which even in systems is unavoidable, to be fair. Sometimes failure just isn't important. The division between systems and scripts is not perfect. But, that will be the uncommon case in systems. It is not certain that really needs a symbol in which to draw attention. (An implementation may need a symbol, but that's beyond this discussion)
Rust's whole error handling, including the ? operator work great for embedded systems where Go isn't enough of a systems language to even run.
EDIT: I think you're confused. The ? operator says "I'm not handling this specially here". That doesn't mean the error is just propagated to the top like an uncaught exception in a Python script. It allows you any level of granular handling you'd like.
That said, I hate Go for unrelated reasons, and love Python.
But we're talking about expected failure (network failure, hardware failure, etc.), not exceptional cases (programmer error). You would not want to carry 'expecteds' on exception handlers. Different tools for different jobs.
That said, systems transcend Go. The discussion isn't about Go, or Python, specifically.
Plenty of go code doesn't handle errors, just pretends to but doesn't do anything meaningful when they happen.
Also, what is Python lacking that other languages have? It's expressive and fast to develop, and with type hints and linters, reasonably robust.
My main complaint is performance, but I'll take the speed to write most days.
Abusing the walrus operator — Well, it is abuse then and hard to read.
I actually mean: https://www.gnu.org/software/guile/manual/html_node/Paramete...