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=0
add_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"
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
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