¿Cómo establecer una cadena predeterminada para raw_input?

Estoy usando raw_input de raw_input para leer desde stdin.

Quiero permitir que el usuario cambie una cadena predeterminada dada.

Código:

 i = raw_input("Please enter name:") 

Consola:

 Please enter name: Jack 

El usuario debe presentarse con Jack pero puede cambiarlo (retroceder) a otra cosa.

El argumento Please enter name: sería la solicitud para raw_input y esa parte no debe ser modificable por el usuario.

Podrías hacerlo:

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

De esta manera, si el usuario solo presiona regresar sin ingresar nada, a “i” se le asignará “Jack”.

Python2.7 obtiene raw_input y establece un valor predeterminado:

Pon esto en un archivo llamado 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) 

Ejecuta el progtwig, se detiene y presenta al usuario con esto:

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

El cursor está al final, el usuario presiona la tecla de retroceso hasta que ‘un insecticida’ desaparece, escribe otra cosa y presiona enter:

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

El progtwig termina así, la respuesta final obtiene lo que el usuario escribió:

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

Equivalente a lo anterior, pero funciona 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) 

Más información sobre lo que está pasando aquí:

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

En la respuesta de dheerosaur Si el usuario presiona Enter para seleccionar el valor predeterminado, en realidad no se guardará, ya que Python lo considera como una cadena ”, por lo que se extiende un poco sobre qué dheerosaur.

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

Fyi .. El ASCII value de retroceso es 08

En plataformas con readline , puede utilizar el método descrito aquí: https://stackoverflow.com/a/2533142/1090657

En Windows, puedes usar el módulo 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) 

Tenga en cuenta que las teclas de flechas no funcionan para la versión de Windows, cuando se usa, no ocurrirá nada.

Solo agrego esto porque debes escribir una función simple para reutilizarla. Aquí está el que escribí:

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

Intente esto: raw_input("Please enter name: Jack" + chr(8)*4)

El valor ASCII de backspace es 08 .