Pregunta ¿Cómo hacer un valor opcional para el argumento usando argparse?


Estoy creando un script de python en el que quiero tener un argumento que manipule cuántos resultados de búsqueda obtienes como salida. Actualmente he nombrado el argumento --head. Esta es la funcionalidad que me gustaría que tuviera:

  1. Cuando --head no se pasa a la línea de comando Me gustaría que fuera un valor predeterminado. En este caso, uno bastante grande, como 80

  2. Cuando --head se pasa sin ningún valor, me gustaría que cambie a otro valor por defecto. En este caso, algo limitado, como 10

  3. Cuando --head se pasa con un valor, me gustaría almacenar el valor que se pasó.

Aquí hay un código que describe el problema:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-h',
                        '--head',
                        dest='size',
                        const=80,
                        default=10,
                        action="I don't know",
                        help='Only print the head of the output')
>>> # OFC, that last line will fail because the action is uknown,
... # but here is how I'd like it to work
... parser.parse_args(''.split())
Namespace(size=80)
>>> parser.parse_args('--head'.split())
Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
Namespace(size=15)

Sé que probablemente pueda escribir una acción personalizada para esto, pero primero quiero ver si hay algún comportamiento predeterminado que haga esto.


32
2018-02-24 20:09


origen


Respuestas:


Después de leer un poco más en la documentación encontré lo que necesitaba: nargs='?'. Esto se usa con el store acción, y hace exactamente lo que quiero.

Aquí hay un ejemplo:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--head',
                        dest='size',
                        const=10,
                        default=80,
                        action='store',
                        nargs='?',
                        type=int,
                        help='Only print the head of the output')
>>> parser.parse_args(''.split())
... Namespace(size=80)
>>> parser.parse_args('--head'.split())
... Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
... Namespace(size=15)

Fuente: http://docs.python.org/3/library/argparse.html#nargs


41
2018-02-24 20:25