A diferencia de otros lenguajes, Python no incluye una palabra reservada goto
(del inglés go to, «ir a»), que permita realizar saltos a diversas porciones del código. Pero dada la flexibilidad del lenguaje, es posible implementar un operador de esta características utilizando python-goto. El módulo provee un decorador que emplea los módulos estándar dis
y ctypes
para reemplazar el byte-code generado por el intérprete e ingresar instrucciones de salto. Opera con las palabras label
, para definir una determinada porción del código, y goto
, para realizar el salto.
La instalación de python-goto es bien sencilla vía pip:
pip install python-goto
También puedes descargar manualmente el código de fuente e instalarlo vía python setup.py install
o sencillamente copiar el archivo goto.py
junto a tu programa.
Al momento de escribir este artículo (febrero de 2022), python-goto solo soporta hasta la versión 3.7 de Python. Su utilización en Python 3.8 o posterior probablemente resulte en un error.
Ahora bien, antes de ver cómo utilizar esta herramienta, recordemos cómo funciona goto
en un lenguaje como C que soporta de forma nativa esta funcionalidad. El siguiente código solicita al usuario ingresar un número. Si se ingresa un valor no permitido (por ejemplo, una letra), se utiliza la instrucción goto
para regresar al comienzo y volver a preguntar por el número.
int main(int argc, char *argv[]) { char input[10]; int age; get_input: // Definición de la etiqueta (necesario para usar goto). printf("Ingresa tu edad: "); fgets(input, 10, stdin); age = atoi(input); if (age == 0) { // Si la edad no es válida, volvera la línea 6 // donde está definida la etiqueta get_input. goto get_input; } printf("Tienes %d años.\n", age); return 0; }
Una posible salida de este programa:
Ingresa tu edad: a
Ingresa tu edad: b
Ingresa tu edad: 30
Tienes 30 años.
Utilizando el módulo goto
podemos replicar el código anterior en Python de la siguiente manera:
from goto import with_goto @with_goto # Decorador necesario. def f(): label .get_input # Definir la etiqueta. age = input("Ingresa tu edad: ") try: age = int(age) except ValueError: goto .get_input # Regresar a get_input. print("Tienes", age, "años.") f()
¡Nada más sencillo! Si la entrada no puede ser convertida a un número, en la línea número 10 la ejecución regresa a la número 5, etiquetada con el nombre get_input
.
Evítese usar las palabras label
y goto
para nombrar objetos, pues, como comenté anteriormente, son utilizados por el decorador. De lo contrario, se obtiene un error.
@with_goto # Decorador necesario. def f(): label = 1 label .get_input # Definir porción del código.
Traceback (most recent call last):
...
SyntaxError: Unknown label 'get_input'
He aquí otro ejemplo donde se reimplementa la función incorporada range()
usando goto
:
from goto import with_goto @with_goto def range2(start, stop): i = start result = [] label .begin if i == stop: goto .end result.append(i) i += 1 goto .begin label .end return result # Imprime [1, 2, 3, 4, 5, 6, 7, 8, 9] print(range2(1, 10))
Puedes conocer más sobre la implementación interna del módulo en el proyecto en GitHub.
Con todo, recuerda que la utilización de goto
es considerada una mala práctica en la programación, razón por la cual Python no lo incluye en el lenguaje. Por lo general es más conveniente reemplazar esta herramienta con el uso de bucles y funciones.
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
Luis says:
El tema es que programar usando el goto seria demasiado facil y hay que complicarla un poco sino cualquiera seria programador.
hector palafox says:
la finalidad de cual quier leguaje de programacion es ahorrar codigo creo que GOTO es muy necesario hay veces que en alguna desicion solo necesitar dar un salto a otro lado del programa y listo sin complicaciones
y entre menos codigo escribas es mejor muy parecido como se maneja en Basic : en teoria Phyton es uno de los leguajes mas versaliles se trata de acer las cosas mas sensillas es ridiculo que comente que son malas practicas si a ellos les gustan batallar pues adelante per si eria muy util una heramienta como goto en Phyton
hugo says:
cierto
Carlos Lopez says:
Estoy de acuerdo que la cagaron, el GOTO es una herramienta muy útil y si que hace falta en Python.
ejemplo yo tengo varios for y condicionales if anidados, y necesito volver al principio del programa si entra dentro de varios if anidados, y con el brake o pass o esas instrucciones realmente no se como hacerlo, si alguien me puede ayudar Lo agradezco inmensamente
(editado)
MUCHAS gracias al que me pueda ayudar
Recursos Python says:
Hola, Carlos. Creá un tema en el foro para tu problema, ya que no se puede tratar bien en los comentarios.
Saludos
Juan Antonio says:
Ningún lenguaje estructurado contempla ya el goto, la forma de hacer una reiteración sin el goto es con bucle que contenga todo el programa y una condición que te saque de el….
Ricardo says:
Gracias por su comentario pero después de haber programado en Fortran, Cobol y Visual Basic no acabo de comprender por qué dicen que la utilización de GOTO es una mala práctica, yo no he visto nada más sencillo y entendible que GOTO.
Pudieran escribir un pequeño programa donde muestren cómo puedo saltar a otra línea sin el GOTO?
Gracias.
Recursos Python says:
Hola, Ricardo. El goto se considera una mala práctica porque permite realizar saltos arbitrarios en el código, incluyendo secciones del mismo donde se utilicen variables que aún no fueron definidas, lo cual resultaría en un error. En cambio los bucles y las funciones, con los cuales generalmente se suple el goto en lenguajes como Python, no adolecen de ese conveniente. El ejemplo de la edad sin el goto sería así:
while True:
age = input("Ingresa tu edad: ")
try:
age = int(age)
except ValueError:
pass
else:
break
print("Tienes", age, "años.")
Saludos
RiSoGa says:
En este ejemplo no distingo ninguna sustitución del GOTO y nadie ha podido mostrarme un ejemplo sin GOTO donde tengo que regresar al comienzo del programa si se cumple cierta condición en otra parte del programa.
De donde sacan que es una mala práctica?, de hecho es el único lenguaje de programación (hasta donde yo sé) que no incluye esa instrucción.
Recursos Python says:
Hola, Ricardo. El código dentro de un bucle while regresa automáticamente a la primera línea, te recomiendo que leas este tutorial sobre los bucles: tutorial.recursospython.com/bucles/ . El ejemplo del comentario anterior muestra exactamente eso. En cuanto al goto, ninguno de los lenguajes modernos lo incluye (Java, Rust, Elixir, JavaScript, etc.).
Si tenés algún código en particular que quisieras reformular sin goto, podés crear un tema en el foro: foro.recursospython.com.
Saludos
Daniel says:
Hola y cómo salto hacia atrás sin un GOTO???
Por ejemplo, para una vez terminado un program sensillo por ejemplo…Calcular el area de un cuadrado entrando po teclado los datos.
Una vez calculada el area, poder ingrsar nuevos datos sin que tenga que correr de nuevo el programa..
Esa es mi duda.
Soy novato en PYTHON.
Mi mayor experiencia fue en ASSEMBLER para 6800.
Utilizaba JMP..Y BRANCH por ejemplo.
Si alguien me puede sacar la duda.MUCHAS GRACIAS!
Recursos Python says:
Hola. En ese caso lo más conveniente sería usar un bucle while.
Saludos
Daniel says:
Muchas grs!.
Igual se me siguen presentando problemas y no sé cómo resolverlos sin un GOTO…
Lástima no puedo poner acá el diagrama de flujo para esxplicarlo…
Recursos Python says:
Hola, Daniel. Podés crear un tema en el foro y comentarnos tu problema: https://foro.recursospython.com/.
Saludos