Let from module import function
be called the FMIF coding style.
Let import module
be called the IM coding style.
Let from package import module
be called the FPIM coding style.
Why is IM+FPIM considered a better coding style than FMIF? (See this post for the inspiration for this question.)
Here are some criteria which lead me to prefer FMIF over IM:
chisquare(...)
appears more readable than scipy.stats.stats.chisquare(...)
. Although this is a subjective criterion, I think most people would agree. function
from alt_module
instead of module
I need to change just one line: from alt_module import function
. If I were to use IM, I'd need to change many lines of code. I am interested in all reasons why IM+FPIM may be better than FMIF, but in particular, I'd be interested in elaboration on the following points mentioned here:
Pros for IM:
Many thanks.
Use from import when you want to save yourself from typing the module name over and over again. In other words, when referring to a member of the module many times in the code. Use import when you want to use multiple members of the module.
Either method is acceptable, but don't use from module import * . For any reasonable large set of code, if you import * you will likely be cementing it into the module, unable to be removed.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With