¿Desea mostrar% después de ingresar (…)?

Supongamos que estamos en python3.3 y multiplataforma (Linux y WIndow), si hago lo siguiente:

>>> eval(input("enter a percent from 1-100")) 

Yo obtengo:

 enter a percent from 1-100: (Terminal is Waiting for user prompt) 

Quiero que muestre:

 enter a percent from 1-100: (waiting for user prompt) % 

¿Cómo muestro ese % siguiendo el paréntesis?

Si entiendo su pregunta, desea poder escribir un mensaje que incluya un carácter de signo % , pero que coloque el cursor del usuario a la izquierda del signo, de esta manera:

 Enter a percent from 1-100: % ^ cursor is here 

No hay una solución universal para esto, ya que el IO de texto básico generalmente se orienta alrededor de flujos de entrada y salida que no tienen interacciones bien definidas. Existen algunos enfoques que funcionarán en algunas situaciones, pero no en otras, pero no estoy seguro de que funcionará en todas partes (excepto escribir una GUI).

Una sugerencia que tengo es incluir caracteres de retroceso ASCII (y Unicode) '\b' (o '\x08' ) en su solicitud. En algunas consolas, esto moverá el cursor a la izquierda un carácter por retroceso. Por lo tanto, el aviso anterior podría ser generado por:

 input("Enter a percent from 1-100: %\b\b\b\b\b") 

Esto funciona cuando ejecuto Python desde un shell de Windows CMD.exe , pero no cuando lo ejecuto dentro de IDLE (los caracteres '\x08' se muestran como un cuadro con un pequeño círculo sacado del medio). Sin embargo, es un poco burdo, ya que no puede evitar que el usuario ingrese más caracteres que espacios antes del % (que se sobrescribirá con el quinto carácter ingresado).

Otra solución que puede ser un poco más robusta (pero no multiplataforma, por desgracia) es usar el módulo de curses . No tengo el conocimiento suficiente para sugerir código, pero debería ser posible hacer que haga lo que quiera (e incluso controlar cosas como evitar que el usuario ingrese más de tres caracteres o mover el signo % para alinearse correctamente con los valores) de cualquier longitud).

Una última cosa: le sugiero encarecidamente que no utilice eval en su llamada de input . Si espera (y requiere) un valor entero, use int(input()) . Si puede obtener un número entero, pero también puede obtener otro tipo de valor, use varias líneas para probar lo que obtuvo:

 def get_val(): str_val = input() try: return int(str_val) # handle numbers like 1, 23232, etc. except ValueError: pass try: return float(str_val) # handles 23.5 and -3e-3 (but beware, also "nan" and "inf") except ValueError: pass try: return make_some_other_value(str_val) # whatever you want except ValueError: pass return str_val # give up and return the string 

Aquí hay una alternativa utilizando el paquete getch . En lugar de utilizar la input , rodaremos la nuestra.

 import string import sys try: from msvcrt import getch except ImportError: from getch import getch def char_valid(char): """Do whatever validation you need here.""" return char in string.ascii_letters or char in string.digits def char_bkspace(char): """Matches backspace and delete.""" return char in ['\x08', '\x7f'] message_pre = 'enter a percent from 1-100' message_post = '%' user_input = '' while True: sys.stdout.write('\r{0} {1} {2}'.format(message_pre, user_input, message_post)) char = getch() if char_bkspace(char): user_input = user_input[:-1] elif char_valid(char): user_input += char else: break print('\nyour message was', user_input) 

Esto permite que el usuario ingrese un carácter a la vez en un bucle while usa getch . Al utilizar sys.stdout.write('\r...') podemos evitar nuevas líneas y sobrescribir constantemente la línea anterior.

Esto tiene el problema de que si retrocedes, varios% ‘s serán visibles porque la nueva línea no está sobrescribiendo completamente la línea anterior. Esto se puede arreglar rellenando la cadena con espacios.