202 votes

Interface de ligne de commande APT de type oui/non ?

Existe-t-il un moyen court d'obtenir ce que l'APT ( Outil de conditionnement avancé ) de l'interface de ligne de commande fait en Python ?

Je veux dire, quand le gestionnaire de paquets pose une question oui/non suivie par [Yes/no] , le script accepte YES/Y/yes/y o Enter (la valeur par défaut est Yes comme l'indique la lettre majuscule).

La seule chose que je trouve dans la documentation officielle est input y raw_input ...

Je sais que ce n'est pas si difficile à émuler, mais c'est ennuyeux à réécrire :|

16 votes

Dans Python 3, raw_input() s'appelle input() .

267voto

fmark Points 15028

Comme vous l'avez mentionné, le moyen le plus simple est d'utiliser raw_input() (ou simplement input() para Python 3 ). Il n'y a pas de moyen intégré de le faire. À partir de Recette 577058 :

import sys

def query_yes_no(question, default="yes"):
    """Ask a yes/no question via raw_input() and return their answer.

    "question" is a string that is presented to the user.
    "default" is the presumed answer if the user just hits <Enter>.
            It must be "yes" (the default), "no" or None (meaning
            an answer is required of the user).

    The "answer" return value is True for "yes" or False for "no".
    """
    valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
    if default is None:
        prompt = " [y/n] "
    elif default == "yes":
        prompt = " [Y/n] "
    elif default == "no":
        prompt = " [y/N] "
    else:
        raise ValueError("invalid default answer: '%s'" % default)

    while True:
        sys.stdout.write(question + prompt)
        choice = input().lower()
        if default is not None and choice == "":
            return valid[default]
        elif choice in valid:
            return valid[choice]
        else:
            sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n")

(Pour Python 2, utilisez raw_input au lieu de input .) Exemple d'utilisation :

>>> query_yes_no("Is cabbage yummier than cauliflower?")
Is cabbage yummier than cauliflower? [Y/n] oops
Please respond with 'yes' or 'no' (or 'y' or 'n').
Is cabbage yummier than cauliflower? [Y/n] [ENTER]
>>> True

>>> query_yes_no("Is cabbage yummier than cauliflower?", None)
Is cabbage yummier than cauliflower? [y/n] [ENTER]
Please respond with 'yes' or 'no' (or 'y' or 'n').
Is cabbage yummier than cauliflower? [y/n] y
>>> True

0 votes

elif choice in valid: Et je renverrais probablement un booléen.

0 votes

Bon choix Ignacio, amendement

27 votes

En fait, il existe une fonction strtobool dans la bibliothèque standard : docs.python.org/2/distutils/

98voto

Vicki Laidler Points 1379

Je le ferais de cette façon :

# raw_input returns the empty string for "enter"
yes = {'yes','y', 'ye', ''}
no = {'no','n'}

choice = raw_input().lower()
if choice in yes:
   return True
elif choice in no:
   return False
else:
   sys.stdout.write("Please respond with 'yes' or 'no'")

9 votes

raw_input() s'appelle input() dans Python3

53voto

Il existe une fonction strtobool dans la bibliothèque standard de Python : http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool

Vous pouvez l'utiliser pour vérifier l'entrée de l'utilisateur et la transformer en True o False valeur.

0 votes

f signifie probablement "faux", et False == 0 donc je comprends la logique. Pourquoi la fonction renverrait-elle un int au lieu d'un bool est un mystère pour moi.

0 votes

@FrançoisLeblanc sur la raison pour laquelle il est le plus courant dans les bases de données. S'il n'est pas explicitement False o 0 (Zéro). Tout ce qui est évalué à l'aide de la fonction bool devient vrai et sera retourné : 1 .

0 votes

@JayRizzo Je comprends ça, et ils sont tous deux fonctionnellement similaires à la plupart des égards. Mais cela signifie que vous ne pouvez pas utiliser la comparaison de singleton, c'est-à-dire if strtobool(string) is False: do_stuff() .

50voto

Danilo Bargen Points 3912

Une façon très simple (mais pas très sophistiquée) de faire cela pour un seul choix serait :

msg = 'Shall I?'
shall = input("%s (y/N) " % msg).lower() == 'y'

Vous pouvez également écrire une fonction simple (légèrement améliorée) pour contourner ce problème :

def yn_choice(message, default='y'):
    choices = 'Y/n' if default.lower() in ('y', 'yes') else 'y/N'
    choice = input("%s (%s) " % (message, choices))
    values = ('y', 'yes', '') if choices == 'Y/n' else ('y', 'yes')
    return choice.strip().lower() in values

Remarque : sous Python 2, utilisez raw_input au lieu de input .

9 votes

J'aime la première approche. Courte et facile. J'ai utilisé quelque chose comme result = raw_input("message").lower() in ('y','yes')

27voto

james Points 279

Comme mentionné par @Alexander Artemenko, voici une solution simple utilisant strtobool

from distutils.util import strtobool

def user_yes_no_query(question):
    sys.stdout.write('%s [y/n]\n' % question)
    while True:
        try:
            return strtobool(raw_input().lower())
        except ValueError:
            sys.stdout.write('Please respond with \'y\' or \'n\'.\n')

#usage

>>> user_yes_no_query('Do you like cheese?')
Do you like cheese? [y/n]
Only on tuesdays
Please respond with 'y' or 'n'.
ok
Please respond with 'y' or 'n'.
y
>>> True

9 votes

Juste curieux... pourquoi sys.stdout.write au lieu de print ?

2 votes

Notez que strtobool() ne nécessite pas (d'après mes tests) un lower() . Ce n'est cependant pas explicite dans sa documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X