2008-12-24 21 views
35

Estoy usando el módulo optparse de python en mi programa, y ​​tengo problemas para encontrar una manera fácil de analizar una opción que contiene una lista de valores.Lista Optparse de Python

Por ejemplo:

--groups one,two,three. 

Me gustaría ser capaz de acceder a estos valores en un formato de lista como options.groups[]. ¿Hay una opción optparse para convertir valores separados por comas en una lista? ¿O tengo que hacer esto manualmente?

Respuesta

36

Mire option callbacks. Su función de devolución de llamada puede analizar el valor en una lista utilizando un básico optarg.split(',')

78

respuesta de S. Lott ya ha sido aceptado, pero aquí es un ejemplo de código de los archivos:

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) 
9

Una vez más, sólo por el hecho de exhaustividad archivo, ampliando el ejemplo anterior:

  • puede seguir utilizando "destino" para especificar el nombre de la opción para acceso posterior
  • valores predeterminados no se pueden utilizar en estos casos (ver explicación en Triggering callback on default value in optparse)
  • Si desea validar la entrada, OptionValueError se debe tirar de foo_callback

El código (con pequeños cambios) sería entonces:

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) 
4

Con optparse, para conseguir un valor de la lista se puede utilizar la acción 'anexar':

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

Entonces llame a su programa como este:

$ pitón demo.py --group uno --group dos --group tres

[ 'uno', 'dos', 'tres' ]

Cuestiones relacionadas