2012-06-12 14 views
9
class StartAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

Sé normalmente que la acción sea algo así como 'store_true' evitaría el requisito de un argumento, pero ¿hay alguna manera de usar una acción personalizada y aún no requerir que se pase un argumento?Argparse - ¿Acción personalizada sin argumento?

Así que lo que quiero es:

python example.py -s

Hello

Respuesta

15

Trate de añadir a su nargs=0start.add_argument:

start.add_argument('-s', '--start', action=StartAction, nargs=0) 
+1

ValueError: nargs para las acciones de la tienda debe ser> 0; si no tiene nada que almacenar, las acciones como store true o store const pueden ser más apropiadas – Lucina

+1

No estoy de acuerdo con el comentario de @Lucina. Es posible que desee llamar a una acción personalizada para tener una asignación perfecta entre los argumentos de análisis y las acciones complejas. Prefiero tener objetos de acción que se comporten como los parámetros de la CLI, así que tengo polimorfismo entre la interfaz de la CLI y el objeto que la maneja. – Daniel

3

Como mgilson suggestednargs=0 hace el truco. Puesto que es intrínseca a su acción, me lo puso dentro de la acción:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

y tiene su comportamiento deseado sin la redundancia de tener que añadir a cada nargs=0add_argument() llamada. Limpio si tienes múltiples argumentos trabajando de la misma manera.

Sin embargo, los usuarios aún pueden anular el valor predeterminado de nargs=0 que es absurdo para su caso de uso como se muestra en la pregunta. Entonces lo haría cumplir:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     if nargs != 0: 
      raise ValueError('nargs for StartAction must be 0; it is ' 
          'just a flag.') 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 
Cuestiones relacionadas