1
votes

Validation d'entrée Python pour les entiers supérieurs à zéro

J'ai le code suivant que j'essaie de valider que l'entrée fournie par l'utilisateur est supérieure à zéro, mais la valeur renvoyée n'est pas la valeur correcte - par exemple, si j'entre un zéro pour le premier angle, puis tapez quelque chose de supérieur à zéro, le zéro est renvoyé et non la valeur correcte. Des idées sur la façon de résoudre le problème?

def ValidTriangle(firstAngle, secondAngle, thirdAngle):

    if (firstAngle + secondAngle + thirdAngle) == 180:
        print("The triangle is indeed a valid triangle")
    else:
        print("The triangle is not valid")


def ValidateInput(angle):
        if angle <=0: 
            isValid = False
        else:
            isValid = True

        while isValid == False:
            try:
                angle = int(input('Please try again'))
                break

            except ValueError:
                return(angle)                

angle1 = int(input("Please enter the first angle of the triangle: \n"))
ValidateInput(angle1)
angle2 = int(input("Please enter the second angle of the triangle: \n"))
ValidateInput(angle2)
angle3 = int(input("Please enter the third angle of the triangle: \n"))
ValidateInput(angle3)

ValidTriangle(angle1,angle2,angle3)


2 commentaires

ValidateInput ne renvoie quelque chose qu'en cas d'erreur; pas que ce soit important, puisque vous ne faites rien avec une valeur renvoyée.


Les noms de variable et de fonction doivent suivre le style lower_case_with_underscores .


3 Réponses :


0
votes

Vous avez oublié de mettre une clause d'angle de retour sous la condition IsValid est True et après avoir rompu la clause while. Vous devriez ajouter cela et cela devrait fonctionner. C'est-à-dire

def ValidateInput(angle):
    if angle <=0: 
        isValid = False
    else:
        isValid = True 
        return(angle)

    _angle = angle
    while isValid == False:
        try:
            _angle = int(input('Please try again'))
            break

        except ValueError:
            return(_angle)

Vous l'avez renvoyé en cas d'erreur, mais vous avez également la variable appelée dans la fonction imitant celle qui est créée dans la fonction, c'est aussi déroutant. Il devrait renvoyer un nom de variable différent pour éviter cette imitation aussi, je crois.

Je n'ai peut-être pas bien expliqué cela, mais j'espère que cela aide.


2 commentaires

Je vois toujours le même résultat lorsque je l'essaye de cette façon - c'est-à-dire que seule la valeur invalide est renvoyée


vous devez stocker la valeur retournée de ValidateInput dans angle1 angle1 = ValidateInput (angle1) et ainsi de suite avec chacun des appels ValidateInput. De cette façon, si ValidateInput a une nouvelle valeur pour l'angle, vous la stockez et l'utilisez lorsque vous validez le triangle.



0
votes

Assurez-vous que ValidateInput renvoie l'angle modifié. De plus, la boucle while ici peut être remplacée par la récursivité pour appeler à nouveau ValidateInput:

def ValidTriangle(firstAngle, secondAngle, thirdAngle):

    if (firstAngle + secondAngle + thirdAngle) == 180:
        print("The triangle is indeed a valid triangle")
    else:
        print("The triangle is not valid")


def ValidateInput(prompt):
    angle = int(input(prompt))
    if angle <= 0:
        isValid = False
    else:
        isValid = True

    if not isValid:
        angle = ValidateInput('Please try again: ')

    return angle            

angle1 = ValidateInput("Please enter the first angle of the triangle: \n")
angle2 = ValidateInput("Please enter the second angle of the triangle: \n")
angle3 = ValidateInput("Please enter the third angle of the triangle: \n")

ValidTriangle(angle1,angle2,angle3)


2 commentaires

Ici aussi, la boucle while peut être remplacée par la récursivité pour appeler à nouveau ValidateInput Pourquoi ...? De tous les changements qui pourraient être apportés ...


De plus, cette solution ne réplique pas la fonctionnalité du programme d'OP, car il n'y a pas de vérification si l'entrée est réellement un int valide,



0
votes

Bien que je ne sois pas tout à fait certain de la meilleure approche pour accepter et valider les entrées dans cette situation, cette solution devrait être assez idiomatique et sensée.

def is_valid_triangle(angle_1: float, angle_2: float, angle_3: float) -> bool:
    return angle_1 + angle_2 + angle_3 == 180


def get_gt_zero_input(prompt_msg: str) -> int:
    while True:
        raw_in = input(prompt_msg)
        try:
            int_val = int(raw_in)
        except ValueError:
            input(f'ERROR: Invalid input: {raw_in}.\nPress ENTER to continue.')
        else:
            if int_val > 0:
                return int_val
            else:
                input(f'ERROR: Input {int_val} is smaller than or equal to 0.\nPress ENTER to continue.')


0 commentaires