2012-03-29 14 views
8

Con optparse, ¿hay una manera simple de definir las opciones negativas, por ejemplo, --no-cleanup?Opciones booleanas negativas --no-whatever en optparse?

lo hice de esta manera, pero es engorroso y error propenso, especialmente debido a la comprobación None que es fácil de olvidar y dejar de lado:

#!/bin/env python 

from __future__ import print_function 
import sys 
import optparse 

def main(argv): 
    parser = optparse.OptionParser("usage: %prog [options]") 
    parser.add_option("--no-cleanup", 
         dest = "cleanup", 
         action = "store_false", 
         help = "do cleanup at end?") 

    (opts, args) = parser.parse_args() 

    if opts.cleanup == None: 
     opts.cleanup = True 

    # do stuff ... 

    if opts.cleanup: 
     print("Cleaning up!", file = sys.stderr) 
    else: 
     print("Not cleaning up", file = sys.stderr) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

Idealmente me gustaría hacer algo como Getoptions::Long en Perl, donde puedo definir una opción cleanup como booleana y luego proporcionará automáticamente --cleanup y --no-cleanup y estableceré mi variable booleana en consecuencia.

+1

argparse tiene esta funcionalidad, ¿o no es una opción? – jterrace

+0

@jterrace: uso Python v2.6, así que creo que no tengo argparse. – Frank

+3

@Frank, argparse se ejecuta en python2.6, simplemente no está en la biblioteca estándar. Si tiene setuptools, 'easy_install argparse' siempre ha funcionado bien para mí. – mgilson

Respuesta

4

Si tuviera que hacer esto usando optparse (o argparse para el caso, suponiendo que quiera agregar un indicador --cleanup y --no-cleanup en un comando), simplemente subclase la clase del analizador de opciones. .. Algo así como:

from optparse import OptionParser 
class MyOptParse(OptionParser): 
     def boolean(self,dest,**kwargs): 
      self.add_option('--%s'%dest,dest=dest,action='store_true',**kwargs) 
      self.add_option('--no-%s'%dest,dest=dest,action='store_false',**kwargs) 

Por supuesto, esto es un corte completo, pero creo que es bastante obvio a dónde voy con él ... puede hacer que se comporte booleano sin embargo usted quiere que (ayuda a formatear , aceptando un valor predeterminado para que '-blah' o '--no-blah' esté configurado como el predeterminado, etc ...)

Creo que

parser=MyOptParse() 
parser.boolean('cleanup',default=True,help="Do/Do Not do cleanup") 

deberían trabajar y deshacerse de la línea if options.cleanup is None mientras está en ello ya se establece el valor por defecto, aunque se repetirá el mensaje de ayuda (con el código que se proporciona)

Si lo que desea es añadir valores por defecto de una bandera en particular (para deshacerse del cheque por None), puede utilizar la palabra clave por defecto a add_option, O, de acuerdo con la documentación optparse ...

una forma más clara para especificar valores por defecto es el set_defaults() método de OptionParser, que y Puede llamar en cualquier momento antes de llamar al parse_args(): p. parser.set_defaults(verbose=True)

+0

debe agregar un argumento '.replace ('-', '_')' en 'dest'. ¿Es posible condensar la ayuda, para evitar redundancias, como en 'man gcc'? –

-1

optparse está obsoleto. Usted puede hacer esto con el uso de un grupo argparse argumento:

#!/usr/bin/env python 
import argparse 

def main(): 
    parser = argparse.ArgumentParser() 
    group = parser.add_mutually_exclusive_group() 
    group.add_argument('--cleanup', action='store_true') 
    group.add_argument('--no-cleanup', dest='cleanup', action='store_false') 
    args = parser.parse_args() 

    # do stuff ... 

    if args.cleanup: 
     print("Cleaning up!") 
    else: 
     print("Not cleaning up") 

if __name__ == "__main__": 
    main() 

El uso del grupo argumento impide que especifica tanto --cleanup y --no-cleanup. Si no se especifica ninguna marca, args.cleanup será None. Si desea cambiar esto para que sea True o False simplemente agregue la palabra clave default, con el valor deseado, al agregar el argumento --cleanup al grupo mutuamente exclusivo.

Para usuarios de Python 2.6, puede pip install argparse.

+2

Sin embargo, esto no agrega automáticamente un marcador '--enable_cleanup'. Si bien es la acción predeterminada, pensé que la pregunta quería que ambas banderas estuvieran presentes ... – mgilson

+0

@mgilson corregido. – wim