Analizar valores booleanos en argumentos de línea de comandos

Vaibhav Vaibhav 12 abril 2022
Analizar valores booleanos en argumentos de línea de comandos

Al ejecutar scripts de Python desde cualquier línea de comando, por ejemplo, el símbolo del sistema, Git Bash, la terminal de Linux, MAC Shell, etc., podemos pasarles argumentos o valores. Estos valores se conocen como argumentos de línea de comando.

Estos argumentos son generalmente números enteros, números flotantes, cadenas y valores booleanos representados como cadenas, lo que significa que deben encasillarse dentro del código.

En este artículo, aprenderemos cómo analizar valores booleanos a partir de argumentos de línea de comando usando Python.

Analizar valores booleanos a partir de argumentos de la línea de comandos utilizando el módulo argparse en Python

Python tiene un montón de módulos integrados esenciales como math, random, json, csv, etc. que tienen como objetivo resolver problemas de programación generales y repetitivos. Uno de esos paquetes es el argparse que ayuda a los programadores a escribir rápidamente interfaces de línea de comandos fáciles de usar. Usando este módulo, uno puede definir los argumentos que el programa requiere para funcionar correctamente.

Además de la definición, el módulo argparse también puede definir valores predeterminados, mensajes de error, textos de ayuda y realizar acciones comunes sobre valores como validación, encasillamiento, conversión, etc. Podemos usar el módulo argparse para nuestro caso de uso.

Implementaremos un programa que necesita un valor de cadena y dos valores booleanos para funcionar correctamente. Este es solo un ejemplo para propósitos de comprensión.

Consulte el siguiente código de Python.

import argparse


def parse_boolean(value):
    value = value.lower()

    if value in ["true", "yes", "y", "1", "t"]:
        return True
    elif value in ["false", "no", "n", "0", "f"]:
        return False

    return False


def output(name, burger, cake):
    if burger and cake:
        return f"{name} is eating a burger and a cake."
    elif burger:
        return f"{name} is eating a burger."
    elif cake:
        return f"{name} is eating a cake."

    return f"{name} is eating nothing."


parser = argparse.ArgumentParser(
    description="A program that accepts one string and two boolean values."
)
parser.add_argument("name", help="Name of a person.")
parser.add_argument(
    "--burger", type=parse_boolean, default=False, help="Flag for burger."
)
parser.add_argument("--cake", type=parse_boolean, default=False, help="Flag for cake.")
args = parser.parse_args()
print(output(args.name, args.burger, args.cake))

Explicación del código Python

El código de Python anterior primero crea un objeto de la clase ArgumentParser. Esta clase tiene todas las utilidades para analizar los argumentos de la línea de comandos. A continuación se muestra la firma de clase de esta clase.

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)

Todos estos argumentos son argumentos de palabra clave y deben pasarse como argumentos de palabra clave a la clase.

Luego, usando la función add_argument() de este objeto, agregamos argumentos al analizador. Los siguientes son algunos de los argumentos principales para esta función.

  • name - Un nombre o una lista de cadenas de opciones. Por ejemplo, world, o --world y -w.
  • action - la acción a realizar cuando este argumento se encuentra en los argumentos de la línea de comandos.
  • nargs - El número de argumentos de la línea de comandos que deben ser considerados.
  • type - el tipo de datos al que se debe convertir el argumento.
  • const - Un valor constante requerido para action y nargs.
  • default - el valor predeterminado que debe tenerse en cuenta si falta el argumento en los argumentos de la línea de comandos.
  • help - El texto de ayuda para el argumento.

Agregamos tres argumentos, a saber, name, --burger y --cake. Aquí, name es un argumento posicional, y --burger y --cake son dos argumentos opcionales. Definimos el texto de ayuda para cada argumento, y para los argumentos opcionales, también definimos los valores por defecto.

A continuación, convertimos los argumentos de cadena en sus respectivos objetos o tipos de datos utilizando el método parse_args(). Este método devuelve un objeto Namespace que contiene todos los argumentos como claves que apuntan a sus respectivos valores convertidos. Podemos acceder a estos valores encasillados de la siguiente manera.

args.name
args.burger
args.cake

También definimos dos funciones, a saber, parse_boolean() y output(). La función parse_boolean() acepta el valor introducido como un argumento de línea de comandos junto a los argumentos booleanos opcionales. Luego interpreta el valor y devuelve el valor booleano correspondiente.

Tenga en cuenta que aquí la función devolverá False para cualquier valor incomprensible. También se puede generar una exception en lugar de devolver algún valor predeterminado. Puede probar eso usando el siguiente comando.

python main.py Vaibhav --burger Hello --cake World

Producción :

Vaibhav is eating nothing.

La otra función es la función output(). Esta función acepta los tres valores (una cadena y dos booleanos) y devuelve una cadena de salida adecuada.

Pruebas

Para probar el programa, ejecute los siguientes comandos desde cualquier línea de comandos. Tenga en cuenta que los siguientes comandos consideran que el código de Python anterior está presente dentro de un archivo con el nombre de main.py.

python main.py Vaibhav --burger True --cake True
python main.py Vaibhav --burger T --cake 0
python main.py Vaibhav --burger False --cake False
python main.py Vaibhav --burger True --cake False
python main.py Vaibhav --burger False --cake True
python main.py Vaibhav --burger ABC --cake XYZ
python main.py Vaibhav
python main.py Vaibhav --burger True
python main.py Vaibhav --cake False
python main.py

Producción :

Vaibhav is eating a burger and a cake.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating a cake.
Vaibhav is eating nothing.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
usage: main.py [-h] [--burger BURGER] [--cake CAKE] name
main.py: error: the following arguments are required: name

Como podemos ver, el último comando, python main.py, arroja un error. La razón detrás del mismo es simple; name es un argumento posicional y obligatorio.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.