I set up Python program options and arguments in a separate function
Pretty much every programming language worth using has a standard
library or package for parsing command line options and arguments,
and Python is no exception; the standard for doing it is argparse
. Argparse handles
a lot of the hard work for you, but you still have to tell it what
your command line options are, provide help text for things, and
so on. In my own Python programs, I almost always do this setup in
a separate function that returns a fully configured
argparse.ArgumentParser
instance.
My standard way of writing all of it looks like this:
def setup(): p = argparse.ArgumentParser(usage="...", ....) p.add_argument(...) p.add_argument(...) return p def main(): p = setup() opts = p.parse_args() ...
I don't like putting all of this directly in my main()
because in most
programs I write, this setup work is long and verbose enough to obscure
the rest of what main()
is doing. The actual top level processing and
argument handling is the important thing in main()
, not the setup of
options, so I want all of the setup elsewhere where it's easy to skip
over. In theory I could put it at the module level, not in a function,
but I have a strong aversion to running code at import
time. Among
other issues, if I got something wrong I would much rather have the
stack trace clearly say that it's happening in setup()
than something
more mysterious.
Putting it in a function that's run explicitly can have some advantages in specialized situations. For instance, it's much more natural to use complex logic (or run other functions) to determine the default arguments for some command line options. For people who want to write tests for this sort of thing, having all of the logic in a function also makes it possible to run the function repeatedly and inspect the resulting ArgumentParser object.
(I think it's widely accepted that you shouldn't run much or any code at import time by putting it in the top level. But setting up an ArgumentParser may look very much like setting up a simple Python data structure like a map or a list, even though it's not really.)
|
|