es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Typer Python: Recibo un error “Error: Se obtuvo un argumento adicional inesperado (valorcadena)” al pasar una cadena a mi función.

Así que estaba intentando hacer una aplicación de lista de tareas en la línea de comandos (CLI) en Python utilizando Typer y quiero que muestre un mensaje cuando no se le proporciona ninguna tarea. Así que establecí “task” con un valor predeterminado de None.
Pero cuando paso un valor a “task” como por ejemplo “driving”, obtengo el error “Got an unexpected extra argument”.
¿Algún consejo sobre cómo solucionar este error o quizás otra solución para mostrar un error cuando no se pasa ningún argumento a la función?
Aquí está mi código:

@app.command()
def add(priority:int, task="None"):
    if task=="None":
        print("Error: Missing tasks string. Nothing added!")
    else:
        dict1={}
        dict1.update({task:priority})
        filesize1= os.stat('output.pickle').st_size
        if filesize1==0:
            pf=open("output.pickle","wb")
        else:
            pf=open("output.pickle","ab")
        pickle.dump(dict1, pf)
        pf.close()
        pf=open("output.pickle","rb")
        dict2={}
        while 1:
            try:
                dict2.update(pickle.load(pf))
            except EOFError:
                break
        pf.close()
        dict3={k:v for k,v in sorted(dict2.items(),key= lambda v:v[1])}
        print('Added task: "'+task+'" with priority '+str(priority))

        file1=open("ls.txt","w+")

        i=1
        for  key,value  in dict3.items():
            file1.write(str(i)+". "+key+ " ["+str(value)+"]"+"\n")
            i=i+1
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el valor predeterminado para el parámetro de tarea está configurado como la cadena “None” en lugar de None. Esto hace que el analizador de argumentos asuma que “None” es un valor real pasado para el parámetro de tarea, lo que resulta en el error “Se obtuvo un argumento extra inesperado” cuando se proporciona un nombre de tarea.

    Para solucionar este error, cambie el valor predeterminado para el parámetro de tarea a None:

    @app.command()
    def add(priority: int, task=None):
        if task is None:
            print("Error: Falta la cadena de tareas. ¡No se agregó nada!")
        else:
            # Resto del código
    

    De esta manera, el analizador de argumentos reconocerá correctamente que el parámetro de tarea tiene un valor predeterminado de None y no mostrará un error cuando se proporcione un nombre de tarea.

    Otra forma de verificar si se proporciona un nombre de tarea es utilizar un parámetro requerido para el argumento de tarea y manejar el mensaje de error en el callback:

    @app.command()
    def add(priority: int, task: str):
        # Resto del código
    
    @app.callback()
    def callback():
        print("Error: Falta la cadena de tareas. ¡No se agregó nada!")
    

    De esta manera, si el usuario no proporciona un nombre de tarea, Typer mostrará automáticamente el mensaje de error especificado en el callback.

Comments are closed.