def option_setup(func): optionParser = OptionParser(usage=usage) optionParser.disable_interspersed_args() for opt in option_list: # opt is an optparse Option optionParser.add_option(opt) optionParser.set_usage("%s [options] %s" % (func.__name__[3:], arg_desc)) optionParser._func = func def oUpdateOptionParser(instance): if func.__name__.startswith('do_'): sName = func.__name__[3:] if hasattr(instance, 'oConfig') and sName in instance.oConfig: oConfigSection = instance.oConfig[sName] # iterate over optionParser for sKey, gVal in oConfigSection.iteritems(): sOption = '--' +sKey if optionParser.has_option(sOption): oOption = optionParser.get_option(sOption) # FixMe: only if the default is optparse.NO_DEFAULT? if oOption.default is optparse.NO_DEFAULT: # FixMe: does this set the default? oOption.default = gVal # FixMe: how about this? optionParser.defaults[oOption.dest] = oOption.default return optionParser def new_func(instance, arg): try: # makebe return a list and prepend it optionParser = oUpdateOptionParser(instance) opts, newArgList = optionParser.parse_args(arg.split()) # Must find the remaining args in the original argument list, but # mustn't include the command itself #if hasattr(arg, 'parsed') and newArgList[0] == arg.parsed.command: # newArgList = newArgList[1:] newArgs = remaining_args(arg, newArgList) if isinstance(arg, ParsedString): arg = arg.with_args_replaced(newArgs) else: arg = newArgs except optparse.OptParseError as e: print (e) optionParser.print_help() return if hasattr(opts, '_exit'): return None result = func(instance, arg, opts) return result func._optionParser = optionParser if func.__doc__ is None and usage is None: func.__doc__ = "" elif func.__doc__ is None and usage: func.__doc__ = usage elif usage: func.__doc__ = '%s\n%s' % (usage, func.__doc__, ) new_func.__doc__ = '%s\n%s' % (func.__doc__, optionParser.format_help()) return new_func