If you require user code to explicitly import functions from modules, you can safely add a function to a module or to the standard library without risking to break someone's code.
Importing the module is not sufficient: really, the functions (or any other imported objects) themselves need to be named. (or, the function needs to be qualified with the name of the module; actually, Python seems to do a reasonable job at this)
As a text editor user, it also helps me discover where such or such function is defined. The alternatives are:
- using an IDE that will consume a lot of CPU cycles and memory to resolve the functions
- grepping, with the risk of finding another function with the same name so I would also need to check if the type signature matches.
I'll gladly spend the time to write my import statement to solve all these issues. It does not bother me. It's not where I spend my time when I program.
It's okay if IDEs hide those import statements or produce them automatically (and it does not mean it's the wrong approach). The point is: code should not break (compilation or runtime) if a module or the standard library evolves and add stuff that could have otherwise clashed. The work being done automatically and the result being hidden by default does not mean it can be done the same way in the future and therefore should be avoided; that's because the environment can change, so it has to be done at the time the code is written, manually or automatically.