Total newbie question: Best practice

Colin Higwell colinh at somewhere.invalid
Tue Nov 29 18:08:30 EST 2011


On Tue, 29 Nov 2011 16:57:18 -0500, Dave Angel wrote:

> On 11/29/2011 03:06 PM, Colin Higwell wrote:
>> Hi,
>>
>> I am just starting to learn Python (I have been at it only a few
>> hours), so please bear with me. I have a few very small scripts (do you
>> call them scripts or programs?) which work properly, and produce the
>> results intended.
>>
>> However, they are monolithic in nature; i.e. they begin at the
>> beginning and finish at the end. Having done a little reading, I note
>> that it seems to be quite common to have a function main() at the start
>> (which in turn calls other functions as appropriate), and then to call
>> main() to do the work.
>>
>> Is that standard best practice?
>>
>> Thanks
>>
> Welcome to Python, and to the comp.lang.python list. Is this your first
> experience programming?
> 
> Yes, factoring your code from "monolithic" to "modular' (several
> functions, or even functions and classes), is good practice.
> 
> That's not to say that some problems don't deserve a monolithic answer,
> but if you're a beginner, i'd like to see you get into a modular habit.
> 
> You can use the words script and program pretty much interchangeably.
> in some contexts, each has additional connotations.  For example,
> somebody used to a compiled language may refer to a python source file
> as a script, implying it's not as sophisticated as his own product.
> But, closer to home, we usually refer to the file you directly pass to
> the interpreter as a script, and any added files that get imported, as
> modules, or libraries.
> 
> Other times, people will refer to a simple program as a script, implying
> that all it does is invoke some standard library functions, or even run
> some external programs.  But when it gets more complex, it gradually
> turns into a  "real program."
> 
> 
> Why break up a monolith?
> 
> Several reasons.  If you factor the code into independent functions, and
> give them good names, then each piece of the program is easier to
> understand.  You will especially appreciate that if you come back to the
> code after doing something else for two weeks.  Similarly if somebody
> else has to take over your code, or maybe adapt it to a slightly
> different purpose.
> 
> Next, if it doesn't quite work, you can exercise the individual pieces
> independently, and narrow down the problem more quickly.
> 
> Next, if the progfram is slow, usually you can narrow it down to a few
> key functions that take most of the time.  You can write two versions of
> the same function, and do some careful timings to decide which one to
> use.
> 
> Next, some of those functions may be useful in the next program you
> write.  If you "reuse" the code by copy & paste, and find a problem in
> the new one, it's quite possible that the same problem may exist in your
> first program.  it's easier to bring those changes back if they're in a
> function than if they're in lines 14 through 71.
> 
> Finally, some of that reusable code may be worth moving to an external
> file, called a module.  Then the same copy can be literally shared
> between multiple projects.  This is how libraries were born, and you can
> write your own, eventually.
> 
> there are many other reasons, but some of them might not make sense to
> you yet.
> 
> 
> How do you break it up?
> 
> First, separate the classic parts that most scripts will have.  Put the
> imports at the top, along with a comment describing the whole progfram's
> purpose.  Next put the global variables, which should be few.  If there
> are any constants, use all UPPERCASE for their names.
> 
> Next, put the function and class definitions.  Notice that none of them
> will be called yet, so the order of execution isn't important to the
> compiler.  Each function needs a name, and you should use a name that
> makes sense to you.  Try to write functions that work at a single level
> of complexity, and do one complete operation.  Try not to do
> input/output in the same functions that do the computation.
> 
> And finally, put the actual mainline.  It could be as simple as a call
> to main(), but it may make more sense to you to put the calls to
> argument processing here, rather than in a main function.  By arguments
> here, i'm referring to the stuff you typed on the command line when youi
> invoked the script.  This part of the code is where you do the magic
> incantation:
> 
> if __name__ == "__main__":
>      main()
> 
> 
> 
> When the number of functions gets unwieldy, it's time to move some of
> them to a new file.  They should be related, and should work at the same
> level of complexity.  And the file name should remind you of their
> purpose.  At that point, you add an import of that file to your main
> source script.  Congratulations, you've created a module.
> 
> One catch with writing a lengthy reply is that others have already given
> you good feedback.  Hopefully, mine will complement theirs.

Thank you, and thanks also to all the other respondents. I have 
programmed before in a number of other languages, but there is still 
plenty in this thread for me to digest.



More information about the Python-list mailing list