web-dev-qa-db-fra.com

Comment définir une chaîne modifiable par défaut pour raw_input?

J'utilise Python 2.7's raw_input pour lire depuis stdin.

Je veux laisser l'utilisateur changer une chaîne par défaut donnée.

Code:

i = raw_input("Please enter name:")

Console:

Please enter name: Jack

L'utilisateur doit être présenté avec Jack mais peut le changer (retour arrière) en quelque chose d'autre.

Le Please enter name: l'argument serait l'invite pour raw_input et cette partie ne doit pas être modifiable par l'utilisateur.

46
ifschleife

Vous pourriez faire:

i = raw_input("Please enter name[Jack]:") or "Jack"

De cette façon, si l'utilisateur appuie simplement sur Entrée sans rien saisir, "i" se verra attribuer "Jack".

79
codefreak

Python2.7 obtient raw_input et définit une valeur par défaut:

Mettez ceci dans un fichier appelé a.py:

import readline
def rlinput(Prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return raw_input(Prompt)
   finally:
      readline.set_startup_hook()

default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)

Exécutez le programme, il s'arrête et présente à l'utilisateur ceci:

el@defiant ~ $ python2.7 a.py
Caffeine is: an insecticide

Le curseur est à la fin, l'utilisateur appuie sur retour arrière jusqu'à ce qu'il n'y ait plus "d'insecticide", tape autre chose, puis appuie sur Entrée:

el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable

Le programme se termine comme ceci, la réponse finale obtient ce que l'utilisateur a tapé:

el@defiant ~ $ python2.7 a.py 
Caffeine is: water soluable
final answer: water soluable

Équivalent à ci-dessus, mais fonctionne en Python3:

import readline    
def rlinput(Prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return input(Prompt)
   finally:
      readline.set_startup_hook()

default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)

Plus d'informations sur ce qui se passe ici:

https://stackoverflow.com/a/2533142/445131

13
Eric Leschinski

Dans la réponse de Dheerosaur Si l'utilisateur appuie sur Entrée pour sélectionner la valeur par défaut, il ne sera pas enregistré en tant que python le considère comme une chaîne '', ce qui étend un peu ce Dheerosaur.

default = "Jack"
user_input = raw_input("Please enter name: %s"%default + chr(8)*4)
if not user_input:
    user_input = default

Pour info .. Le ASCII value du retour arrière est 08

7
Anuj

J'ajoute cela uniquement parce que vous devez écrire une fonction simple à réutiliser. Voici celui que j'ai écrit:

def default_input( message, defaultVal ):
    if defaultVal:
        return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
    else:
        return raw_input( "%s " % (message) )
4
chubbsondubs

Sur les plateformes avec readline, vous pouvez utiliser la méthode décrite ici: https://stackoverflow.com/a/2533142/1090657

Sous Windows, vous pouvez utiliser le module msvcrt:

from msvcrt import getch, putch

def putstr(str):
    for c in str:
        putch(c)

def input(Prompt, default=None):
    putstr(Prompt)
    if default is None:
        data = []
    else:
        data = list(default)
        putstr(data)
    while True:
        c = getch()
        if c in '\r\n':
            break
        Elif c == '\003': # Ctrl-C
            putstr('\r\n')
            raise KeyboardInterrupt
        Elif c == '\b': # Backspace
            if data:
                putstr('\b \b') # Backspace and wipe the character cell
                data.pop()
        Elif c in '\0\xe0': # Special keys
            getch()
        else:
            putch(c)
            data.append(c)
    putstr('\r\n')
    return ''.join(data)

Notez que les touches fléchées ne fonctionnent pas pour la version Windows, quand elle est utilisée, rien ne se passera.

4
quantum