Goto en Python 17


La bonne vieille époque du BASIC vous manque ? Vous voulez retrouver le pouvoir d’aller et venir n’importe où dans votre code et faire des scripts spaghetti bien dégueulasses ?

Téléchargez Go To pour Python.

Le 1 avril est bien passé, et cette lib existe pour de vrai. Elle vous permet de retomber en enfance où on dirait que toi tu peux poser un label et moi je peux y aller directement :

from goto import goto, label
 
label .start
 
print "C'est pas du jeu"
 
for i in range(1, 4):
    print i
    if i == 2:
        try:
            output = message
        except NameError:
            print "T'as oublié le message."
            message = "Salut"
            goto .start
 
print output, "\n"

Si vous regardez le code souce, vous verrez que l’implémentation est une bouillie immonde qui sauvegarde les frames dans un cache et les rebalancent quand on gotouse.

Merci à l’auteur d’avoir pondu cette lib indispensable, si elle n’avait pas existé, je l’aurais codé.

17 thoughts on “Goto en Python

  • kontre

    C’est forcément plus rapide, puisque c’est plus proche de l’assembleur ! C’est génial ! Je vais de ce pas mettre à jour tous mes codes.

    Bon, cela dit, j’ai quand même une question : Comment on fait pour déclarer des mots-clés comme le monsieur le fait avec label et goto ? C’est possible en pur python (même si je suppose que c’est pas conseillé) ?

  • roro

    Et moi, j’aimerais bien savoir où le setup fourre le script.
    Il est bien quelque par, puisque je n’ai pas d’erreur à l’import.

  • kanor

    C’est vraiment moche, pas conseillé mais tu peux faire ça
    >>> def coucou():
    ... return "coucou"
    ...
    >>> __builtins__.yop = coucou
    >>> yop

  • Sam Post author

    @kontre: il ne déclare pas de mot clé, pas plus que ruby ne permet d’écrire des DSL. On utilise juste des subtilités de la syntaxes pour donner l’illusion. En ruby, l’absence de parenthèses donne l’illusion que l’enchainement de méthodes est un DSL. En Python, on peut mettre autant d’espaces que l’ont veut entre un objet et son attribut.

    Quand il fait label .start, il fait en fait label.start, tout simplement.

    @roro: import goto; print(goto.__file__)

  • JeromeJ

    This is madness Ò-Ó

    Fools! You don’t know what you just did! We all gonna die!

    (goto c’est le mal me disait toujours mon maître en me tapant avec un baton)

  • roro

    J’ai exécuté le setup, mis ton bout, ou les exemples dans l’idle:
    Erreur sur le mot: label. Pas sur import!.
    Ta ligne dans la console par contre me dit clairement qu’elle ne trouve pas le module.
    Question: Où je mets le goto.py ? Pour voir fonctionner cette merveille.

  • Sam Post author

    @roro : comme toujours, si tu donnes pas le message d’erreur, non seulement tu n’auras pas la réponse à ta question mais en plus je planterais une aiguilles dans ta poupée vodoo. Tu peux cependant juste mettre goto.py dans le même répertoire que ton script pour que ça marche.

    @sil : tu peux installer une_pipe_et_un_mars.py, je crois qu’il est sur pypi.

  • kontre

    D’accord, c’est super sioux ! Mais du coup, c’est encore moins utile que ce que je pensais.

    Cet article me rappelle ma déception quand j’ai vu qu’ils allaient rajouter des goto en Lua (mais dans des cas bien limités, en gros c’est pour sortir des boucles). Il est sympa ce langage, aussi…

  • Sam Post author

    Cette lib a été utilisée pour un poisson d’avril en 2004 je crois, c’est normal que ce soit inutile. C’est comme for __future__ import braces, c’est des trucs qu’on ne veut jamais voir en Python.

    Un truc que j’ai vu dernièrement dans la rubrique “inutile”:

    def function(params): #{
        faire un truc
    #}

    Réabilitation des {} dans Python !

  • roro

    @Sam. Ah ben ouais..Que je suis con!
    C’est que d’habitude, je mets les scripts dans le python; comme ça ils ont qu’à se servir.

Leave a comment

Your email address will not be published. Required fields are marked *

Utilisez <pre lang='python'>VOTRE CODE</pre> pour insérer un block de code coloré

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.