Is `import module` better coding style than `from module import function`?

The negatives you list for IM/FPIM can often be ameliorated by appropriate use of an as clause. from some.package import mymodulewithalongname as mymod can usefully shorten your code and enhance its readability, and if you rename mymodulewithalongname to somethingcompletelydifferent tomorrow, the as clause can be used as a single statement to edit.

Consider your pro-FMIF point 3 (call it R for redirection) vs your pro-FPIM point 2 (call it F for flexibility): R amounts to facilitating the loss of integrity of module boundaries, while F strenghtens it. Multiple functions, classes and variables in a module are often intended to work together: they should not be independently switched to different meanings. For example, consider module random and its functions seed and uniform: if you were to switch the import of just one of them to a different module, then you’d break the normal connection between calls to seed and results of calls to uniform. When a module is well designed, with cohesion and integrity, R’s facilitation of breaking down the module’s boundaries is actually a negative — it makes it easier to do something you’re better off not doing.

Vice versa, F is what enables coordinated switching of coupled functions, classes, and variables (so, generally, of entities that belong together, by modularity). For example, to make testing repeatable (FPIM pro-point 1), you mock both seed and random in the random module, and if your code follows FPIM, you’re all set, coordination guaranteed; but if you have code that has imported the functions directly, you have to hunt down each such module and repeat the mocking over and over and over again. Making tests perfectly repeatable typically also requires “coordinated mocking” of date and time functions — if you use from datetime import datetime in some modules, you need to find and mock them all (as well as all those doing from time import time, and so forth) to ensure that all the times received when the various parts of the system ask “so what time is it now?” are perfectly consistent (if you use FPIM, you just mock the two relevant modules).

I like FPIM, because there’s really not much added value by using a multiply qualified name rather than a singly qualified one (while the difference between barenames and qualified names is huge — you get so much more control with a qualified name, be it singly or multiply, than you possibly ever can with a barename!).

Ah well, can’t devote all of the working day to responding to each and every one of your points — your question should probably be half a dozen questions;-). I hope this at least addresses “why is F better than R” and some of the mocking/testing issues — it boils down to preserving and enhancing well-designed modularity (via F) rather than undermining it (via R).

Leave a Comment