Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

optparse and counting arguments (not options)

10 views
Skip to first unread message

Steven Bethard

unread,
May 10, 2006, 12:33:37 AM5/10/06
to
I feel like I must be reinventing the wheel here, so I figured I'd post
to see what other people have been doing for this. In general, I love
the optparse interface, but it doesn't do any checks on the arguments.
I've coded something along the following lines a number of times:

class OptionArgParser(optparse.OptionParser):
def __init__(self, *args, **kwargs):
self.min_args = kwargs.pop('min_args', None)
self.max_args = kwargs.pop('max_args', None)
self.arg_values = kwargs.pop('arg_values', None)
optparse.OptionParser.__init__(self, *args, **kwargs)

def parse_args(self, args=None):
options, args = optparse.OptionParser.parse_args(self, args)
if self.min_args is not None and len(args) < self.min_args:
self.error('too few arguments')
if self.max_args is not None and len(args) > self.max_args:
self.error('too many arguments')
if self.arg_values is not None:
for arg, values in zip(args, self.arg_values):
if values is not None and arg not in values:
message = 'argument %r is not one of: %s'
self.error(message % (arg, ', '.join(values)))
return options, args

This basically lets me skip some simple checks by creating instances of
OptionArgParser instead of optparse.OptionParser, and supplying my new
options:

parser = OptionArgParser(
min_args=1, arg_values=[commands],
usage='%%prog [options] (%s) ...' % '|'.join(commands),
description='invoke one of the commands')

Is this problem already solved in some module that I've missed?

STeVe

0 new messages