File: doc_optparse.py

package info (click to toggle)
python-bx 0.13.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,000 kB
  • sloc: python: 17,136; ansic: 2,326; makefile: 24; sh: 8
file content (96 lines) | stat: -rw-r--r-- 2,842 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
:Author: M. Simionato
:Date: April 2004
:Title: A much simplified interface to optparse.

You should use optionparse in your scripts as follows.
First, write a module level docstring containing something like this
(this is just an example)::

    '''usage: %prog files [options]
       -d, --delete: delete all files
       -e, --erase = ERASE: erase the given file'''

Then write a main program of this kind:

# sketch of a script to delete files::

    if __name__=='__main__':
        import optionparse
        option,args=optionparse.parse(__doc__)
        if not args and not option: optionparse.exit()
        elif option.delete: print "Delete all files"
        elif option.erase: print "Delete the given file"

Notice that ``optionparse`` parses the docstring by looking at the
characters ",", ":", "=", "\\n", so be careful in using them. If
the docstring is not correctly formatted you will get a SyntaxError
or worse, the script will not work as expected.
"""

import optparse
import re
import sys
import traceback

USAGE = re.compile(r"(?s)\s*usage: (.*?)(\n[ \t]*\n|$)")


def nonzero(self):  # will become the nonzero method of optparse.Values
    "True if options were given"
    for v in self.__dict__.values():
        if v is not None:
            return True
    return False


optparse.Values.__nonzero__ = nonzero  # dynamically fix optparse.Values


class ParsingError(Exception):
    pass


optionstring = ""


def exception(msg=""):
    print("Exception while parsing command line:", file=sys.stderr)
    print(traceback.format_exc(), file=sys.stderr)
    exit(msg)


def exit(msg=""):
    raise SystemExit(msg or optionstring.replace("%prog", sys.argv[0]))


def parse(docstring, arglist=None):
    global optionstring
    optionstring = docstring
    match = USAGE.search(optionstring)
    if not match:
        raise ParsingError("Cannot find the option string")
    optlines = match.group(1).splitlines()
    try:
        p = optparse.OptionParser(optlines[0], conflict_handler="resolve")
        for line in optlines[1:]:
            opt, help = line.split(":")[:2]
            # Make both short and long optional (but at least one)
            # Old: short,long=opt.split(',')[:2]
            opt_strings = []
            action = "store_true"
            for k in opt.split(", "):
                k = k.strip()
                if k.startswith("--") and "=" in k:
                    action = "store"
                    k = k.split("=")[0]
                opt_strings.append(k)
            p.add_option(*opt_strings, **{"action": action, "help": help.strip()})
    except (IndexError, ValueError):
        raise ParsingError("Cannot parse the option string correctly")
    return p.parse_args(arglist)


def help_callback(option, opt, value, parser, help):
    print(help, file=sys.stderr)
    sys.exit(1)