You are right, but I don’t see the contradiction.
Python is strongly dynamically typed but without the static typing that came with Python 3.6 (as I mentioned later in the article), it lacks type-safety and IDE support for typing.
...def getUserTyped(userId: int) -> User:
There’s much better IDE support for “getUserTyped”. The IntelliSense would suggest int values when calling “getUserTyped” and it would suggest the function itself for any variable/parameter that is statically typed as “User”. Not to mention showing errors if the value being passed isn’t type-safe. Some IDEs can infer types and produce warnings but without explicit static typing, it can’t go very far.
Golang, on the other hand, was meant as an example of verbosity. Go is a minimal language built for performance. Fewer keywords for sure, but this also means that you have to write more code to achieve the same result; hence the verbosity.
Spending more time in development just to improve performance on a server that is likely under-utilized anyway isn’t worth it. If you have enough users and revenue to warrant such a performance upgrade then you can fill the room with developers and re-write the APIs in Golang on a two-week sprint because having 200 backend nodes instead of 500 might save you $1000 per day. For a solo developer or a small startup however, time and salaries are often more valuable than operational costs.