Cómo invocar click.command con argumentos excluidos
Tengo un comando envoltorio que invoca cierto comando en un bucle con período (valor entero, en minutos).
El comando envoltorio no quiere describir los argumentos del comando que se va a envolver.
@click.group(name="wrapper-example")
def wrapper_cli():
pass
@wrapper_cli.command("command")
@click.option("--path", type=str, help="ejemplo de argumento del comando")
def command(path):
click.echo(path)
@wrapper_cli.command(
"run",
context_settings=dict(
ignore_unknown_options=True,
allow_extra_args=True,
),
)
@click.option("--period", type=int, help="minutos")
@click.pass_context
def run(ctx: click.Context, period):
# no se implementa el bucle para un ejemplo claro
ctx.forward(command)
En este ejemplo con forward()
obtendré un error, porque command()
no conoce el argumento period
.
Con el método invoke()
, tengo que analizar manualmente los argumentos de click.Context.args
del envoltorio, que es una lista que contiene argumentos sin procesar y no reconocidos. [“–path”, “path/”]
click.Context.args: List[str]
y pasarla de la siguiente manera:
ctx.invoke(command, **kwargs)
¿Cómo podría excluir algunas variables del contexto para reenviar el comando sin el argumento de período?
¿O cómo podría analizar “click.Context.args: List[str]” de manera clara, que solo contiene valores de argumentos adicionales no definidos para el envoltorio, y luego usar Context.invoke()
?
davy.ai
Desafortunadamente, no hay una forma incorporada de excluir variables específicas del objeto click.Context. Sin embargo, puedes crear manualmente un nuevo diccionario de argumentos para pasar al comando filtrando los argumentos que no deseas pasar.
Aquí tienes un ejemplo de cómo podrías modificar el comando
run
para excluir el argumentoperiod
y crear un nuevo diccionario de argumentos para pasar a la funcióncommand
:Alternativamente, puedes analizar manualmente la lista
Context.args
y crear un nuevo diccionario de argumentos para pasar al comando. Aquí tienes un ejemplo de cómo podrías modificar el comandorun
para hacer esto: