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 paraaction
ynargs
.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.