srgerg tenía razón acerca de la definición de argumentos posicionales. Para obtener el resultado que desea, debe aceptarlos como argumentos opcionales y modificar el espacio de nombres resultante de acuerdo con sus necesidades.
Se puede utilizar una acción personalizada:
class MyAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
# Set optional arguments to True or False
if option_string:
attr = True if values else False
setattr(namespace, self.dest, attr)
# Modify value of "input" in the namespace
if hasattr(namespace, 'input'):
current_values = getattr(namespace, 'input')
try:
current_values.extend(values)
except AttributeError:
current_values = values
finally:
setattr(namespace, 'input', current_values)
else:
setattr(namespace, 'input', values)
parser = argparse.ArgumentParser()
parser.add_argument('-a', nargs='+', action=MyAction)
parser.add_argument('-b', nargs='+', action=MyAction)
parser.add_argument('input', nargs='+', action=MyAction)
Y esto es lo que obtienes:
>>> parser.parse_args(['fileone', '-a', 'filetwo', '-b', 'filethree'])
Namespace(a=True, b=True, input=['fileone', 'filetwo', 'filethree'])
O puede modificar el espacio de nombres dado como resultado la siguiente manera:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-a', nargs='+')
>>> parser.add_argument('-b', nargs='+')
>>> parser.add_argument('input', nargs='+')
>>> result = parser.parse_args(['fileone', '-a', 'filetwo', '-b', 'filethree'])
>>> inputs = []
>>> inputs.extend(result.a)
>>> inputs.extend(result.b)
>>> inputs.extend(result.input)
>>> modified = argparse.Namespace(
a = result.a != [],
b = result.b != [],
input = inputs)
Y esto es lo que obtienes:
>>> modified
Namespace(a=True, b=True, input=['filetwo', 'filethree', 'fileone'])
Sin embargo, ambos métodos dan como resultado un código menos legible y menos sostenible. Tal vez sea mejor cambiar la lógica del programa y hacerlo de otra manera.
¿Qué tal si cambias '' -a'' y '' -b'' a '' append'', luego modificas el espacio de nombres resultante a lo que quieres? –