#!/usr/bin/env python # "Optional option arguments" with Optik, version 1: # supply a callback function to handle options with # optional arguments. # # There are lots of problems with this approach: # * doesn't allow "--home=~"; only "--home" and "--home ~" work # * doesn't allow "-afoo"; only "-a" or "-a foo" work # * option type can't be specified, because that makes # OptionParser require a value # * all the logic about what "-" and "--" mean is duplicated # in the callback here # * it's awkward as hell to use # # This just shows that Optik's current design is ill-suited # to handling optional option args. Hmm. from optik import OptionParser, Option def optional_arg(option, opt, value, parser, option_default=None): assert value is None value = option_default # If there is a next argument, peek at it to see if it can # be considered an argument to 'opt'. if parser.rargs: arg = parser.rargs[0] if arg[0:2] == "--" or arg[0:1] == "-": # Either arg is another option -- "--foobar", "-a" -- or # it's one of the special stop-values, "--" or "-". # In either case, we consider it special and do *not* # consume it as an argument to the current option. pass else: # Otherwise, consume arg and use it as the value for 'option'. value = arg del parser.rargs[0] setattr(parser.values, option.dest, value) parser = OptionParser() parser.add_option("-v", action="callback", dest='verbose', callback=optional_arg, callback_kwargs={'option_default': 1}) parser.add_option("-l", "--log-file", action="callback", dest='log_file', callback=optional_arg, callback_kwargs={'option_default': "foo.log"}) (options, args) = parser.parse_args() print "options.verbose = %r" % options.verbose print "options.log_file = %r" % options.log_file