3
votes

Exit If Instruction si la valeur renvoyée n'est pas un booléen

J'ai une entrée d'utilisateur pour une réponse oui ou non. Je voudrais construire une fonction en python 3 dont je pourrais passer la valeur comme isTrue ('yes') et ensuite la fonction renverrait True et isTrue ( 'no') renverrait False . Je sais que je pourrais simplement utiliser une instruction if pour voir si la valeur est simplement yes ou no , mais pour d'autres raisons, j'aurais intérêt à utiliser une fonction comme isTrue () . Créer la fonction isTrue () est très simple, mais la partie avec laquelle je me bats est de savoir comment gérer une valeur qui n'est ni vraie ni fausse, comme peut-être ou IDK . Idéalement, j'aimerais avoir une instruction if comme celle-ci

if isTrue(userInput):
    print('Input was Ture')
else !isTrue(userInput):
    print('Input was False')
else:
    print('Invalid')

Existe-t-il un moyen de renvoyer une valeur que je pourrais toujours avoir la même structure d'instruction if, mais détecter si la valeur n'était pas N'avez-vous pas True ou False sans avoir à faire quelque chose comme ça et en quelque sorte intégré avec l'instruction True if?

if isTrue(userInput) '''Some code here that would run anther function if the value was not true or false''':
    print('Input was Ture')
else:
    print('Input was False')


2 commentaires

Votre fonction doit avoir trois retours possibles. True et False sont évidents, mais il doit également avoir un troisième état, qui pourrait être "Lever ValueError (userInput)" ou simplement "return None". Sans trois états possibles, vous ne pouvez pas vérifier trois états possibles.


@KennyOstrom Je l'ai actuellement renvoyé aucun si ce n'est ni vrai ni faux


3 Réponses :


2
votes

en booléen, il n'y a que True ou False. mais dans la méthode isTrue si vous renvoyez None, vous pouvez le faire.

if isTrue(userInput)== True:
    print('Input was Ture')
elif isTrue(userInput) == False:
    print('Input was False')
else:
    print('Invalid')


3 commentaires

@Daniel - vous avez raison, merci pour cela. Je pense que je peux vérifier explicitement si c'est vrai ou faux pour surmonter cela.


Merci pour votre réponse, la réponse de Green Cloak Guy était un peu plus informative et complète, c'est pourquoi je l'ai acceptée plutôt que la vôtre, encore une fois merci pour la réponse


@Jack Stoller - bien sûr!



4
votes

J'aborderais ce problème comme ceci:

if isTrue(userInput):
    print('Input was True')
elif isFalse(userInput):
    print('Input was False')
else:
    print('Invalid Repsonse')

La difficulté dans votre cas est principalement que vous avez des définitions non standard de ce qui compte comme True ou Faux . Une approche de base consisterait à créer des ensembles de valeurs que vous considérez comme véridiques ou fausses, et à vérifier si la valeur donnée est en eux - et si elle n'est dans ni l'un ni l'autre, alors ce n'est pas un booléen, et vous pouvez faire ce que vous voulez. Vous pouvez également étendre les définitions de isTrue () et isFalse () pour couvrir des classes entières de valeurs (par exemple, si l'entrée est une liste et sa longueur est supérieure à 0).

Dans ce cas, vous pouvez facilement vérifier si quelque chose est Vrai, Faux, Ni l'un ni l'autre, ou une combinaison de ceux-ci, avec un seul appel:

if isTrue(userInput): ...      # input is explicitly true
if isFalse(userInput): ...     # input is explicitly false
if not isBool(userInput): ...  # input is indeterminate
if not isTrue(userInput): ...  # input is at least not true, might be indeterminate
if not isFalse(userInput): ... # input is at least not false, might be indeterminate

auquel point vous pouvez simplement faire un simple bloc if :

def isTrue(value):
    truthy_values = {'yes', 'true', 'True', ...}
    return value in truthy_values

def isFalse(value):
    falsey_values = {'no', 'false', 'False', ...}
    return value in falsey_values

def isBool(value):
    return isTrue(value) or isFalse(value)


1 commentaires

Merci, cela s'intègre directement dans mon script et fonctionne parfaitement



1
votes

Puisque vous avez trois états possibles, vous avez vraiment besoin de trois valeurs de retour possibles. Vous pouvez renvoyer True, False ou None, mais il est plus judicieux de lever une ValueError. Cela est également utile pour la journalisation ou l'affichage des messages d'erreur si vous mettez une raison dans ValueError.

def evaluate_input(userInput):
    try:
        if (isTrue(userInput)):
            print ('Input was True')
        else:
            print ('Input was False')
    except ValueError as e:
        print ('Invalid input:', str(e))

evaluate_input('True')
evaluate_input('No')
evaluate_input('Potato')

Démonstration de cette fonction en action, avec un gestionnaire d'exceptions:

truthy_values = {'yes', 'y', 't', 'true', '1'}
falsey_values = {'no', 'n', 'f', 'false', '0'}

def isTrue(userInput):
    value = userInput.strip().lower()
    if value in truthy_values:
        return True
    if value in falsey_values:
        return False
    raise ValueError('isTrue could not understand ' + userInput)


0 commentaires