In python all names are looked up at runtime. Therefor, what you refer to as "language" errors are no different than runtime errors.
This makes python different than many other languages. One of the advantages of that fact is that you can easily customize the way names are looked up (e.g. by overriding class's __getattr__
) for example.
You can make use of analyzers (e.g. pyflakes
is pretty cool, but there are many others) to detect some of the errors before running your program, but no tool would be able to detect all.