[OT] main

Steven Bethard steven.bethard at gmail.com
Sat Feb 3 19:42:19 EST 2007


fatwallet961 at yahoo.com wrote:
> def main(argv):
>     try:
>         optlist, args = getopt.getopt(argv[1:], 'hvo:D:', ['help',
> 'verbose'])
>     except getopt.GetoptError, msg:
>         sys.stderr.write("preprocess: error: %s" % msg)
>         sys.stderr.write("See 'preprocess --help'.\n")
>         return 1
>     outfile = sys.stdout
>     defines = {}
>     for opt, optarg in optlist:
>         if opt in ('-h', '--help'):
>             sys.stdout.write(__doc__)
>             return 0
>         elif opt in ('-v', '--verbose'):
>             log.setLevel(logging.DEBUG)
>         elif opt == '-o':
>             outfile = optarg
>         elif opt == '-D':
>             if optarg.find('=') != -1:
>                 var, val = optarg.split('=', 1)
>                 try:
>                     val = eval(val, {}, {})
>                 except:
>                     pass
>             else:
>                 var, val = optarg, None
>             defines[var] = val
> 
>     if len(args) != 1:
>         sys.stderr.write("preprocess: error: incorrect number of "\
>                          "arguments: argv=%r\n" % argv)
>         return 1
>     else:
>         infile = args[0]
> 
>     try:
>         preprocess(infile, outfile, defines)
>     except PreprocessError, ex:
>         sys.stderr.write("preprocess: error: %s\n" % str(ex))

This is offtopic, but I suggest looking into using optparse_ or 
argparse_ instead of getopt. This would simplify your code to something 
like::

     parser = argparse.ArgumentParser(description='Preprocess a file.')
     parser.add_argument('infile', default=sys.stdin,
                         type=argparse.FileType('r'))
     parser.add_argument('-v', '--verbose', action='store_true')
     parser.add_argument('-o', dest='outfile', default=sys.stdout,
                         type=argparse.FileType('w'))
     parser.add_argument('-D', dest='defines', action='append')
     args = parser.parse_args()

     if args.verbose is not None:
         log.setLevel(logging.DEBUG)

     defines = {}
     for define in args.define:
         var, sep, val = define.partition('=')
         defines[var] = val or None

     try:
         preprocess(args.infile, args.outfile, defines)
     except PreprocessError, ex:
         sys.stderr.write("preprocess: error: %s\n" % str(ex))

Additionally, if you include your help messages using the help= argument 
to add_argument(), your usage message will be generated automatically.

.. _optparse: http://docs.python.org/lib/module-optparse.html
.. _argparse: http://argparse.python-hosting.com/

STeVe



More information about the Python-list mailing list