Python is dynamically typed and weakly typed, but still typed. That's precisely the problem! The difference is just that a statically typed language gives you all the information, and a dynamically language doesn't, but still fails. Just without providing you the necessary information up-front.
There's a nice explanation here: https://existentialtype.wordpress.com/2011/03/19/dynamic-lan...