Tengo un script donde le pido al usuario una lista de acciones predefinidas para realizar. También quiero la capacidad de asumir una lista particular de acciones cuando el usuario no define nada. sin embargo, parece que tratar de hacer ambas cosas juntos es imposible.python argparse - opcional anexar argumento con elecciones
cuando el usuario da ningún argumento, que recibe un error que la opción por defecto no es válido
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args([])
>>> usage: [-h] [{clear,copy,dump,lock} [{clear,copy,dump,lock} ...]]
: error: argument action: invalid choice: [['dump', 'clear']] (choose from 'clear', 'copy', 'dump', 'lock')
y cuando lo hacen definir un conjunto de acciones, el espacio de nombres resultante tiene las acciones del usuario anexan al valor predeterminado, en lugar de sustituir el valor predeterminado
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args(['lock'])
args
>>> Namespace(action=[['dump', 'clear'], ['dump']])
No estoy seguro de si esto se ha resuelto mediante un informe de error similar: http://bugs.python.org/issue9625. Una forma posible de manejar esto es usar una acción personalizada, en lugar de la palabra clave 'choices'. Ver la respuesta aceptada en [esta pregunta] (http://stackoverflow.com/questions/4194948/python-argparse-is-there-a-way-to-specify-a-range-in-nargs) – Chris