40

I'm using the python optparse module in my program, and I'm having trouble finding an easy way to parse an option that contains a list of values.

For example:

--groups one,two,three. 

I'd like to be able to access these values in a list format as options.groups[]. Is there an optparse option to convert comma separated values into a list? Or do I have to do this manually?

4 Answers 4

84

S.Lott's answer has already been accepted, but here's a code sample for the archives:

def foo_callback(option, opt, value, parser):
  setattr(parser.values, option.dest, value.split(','))

parser = OptionParser()
parser.add_option('-f', '--foo',
                  type='string',
                  action='callback',
                  callback=foo_callback)
Sign up to request clarification or add additional context in comments.

Comments

40

Look at option callbacks. Your callback function can parse the value into a list using a basic optarg.split(',')

Comments

12

Again, just for the sake of archive completeness, expanding the example above:

  • You can still use "dest" to specify the option name for later access
  • Default values cannot be used in such cases (see explanation in Triggering callback on default value in optparse)
  • If you'd like to validate the input, OptionValueError should be thrown from foo_callback

The code (with tiny changes) would then be:

def get_comma_separated_args(option, opt, value, parser):
    setattr(parser.values, option.dest, value.split(','))

parser = OptionParser()
parser.add_option('-f', '--foo',
                  type='string',
                  action='callback',
                  callback=get_comma_separated_args,
                  dest = foo_args_list)

Comments

10

With optparse, to get a list value you can use action 'append':

from optparse import OptionParser
parser = OptionParser()
parser.add_option("--group",
                  action="append",
                  dest="my_groups")
(options, args) = parser.parse_args()
print options.my_groups

Then call your program like this:

$ python demo.py --group one --group two --group three

['one', 'two', 'three']

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.